Модераторы: Snowy, Poseidon, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> delphi 7 vs 2009 WinInet, один код работает по разному( 
:(
    Опции темы
sssssss7
Дата 14.3.2009, 06:28 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 87
Регистрация: 3.2.2009

Репутация: нет
Всего: нет



вот не большой простой код отправки post запроса:
Код

unit Unit1;
interface
uses
  Windows, Messages, SysUtils, Classes, Graphics, Controls, Forms,
  Dialogs, ComCtrls, Wininet, StdCtrls;
const
  HTTP_PORT = 80;
  CLRF = #13#10;
  Header = 'Content-Type: application/x-www-form-urlencoded' + CLRF;
type
  TForm1 = class(TForm)
    Button1: TButton;
    Memo1: TMemo;

    procedure Button1Click(Sender: TObject);
  end;
var
  Form1: TForm1;
implementation
{$R *.dfm}


function GetUrl(const URL: String): String;
var
  FSession, FConnect, FRequest: HINTERNET;
  FHost, FScript: String;
  Ansi: PAnsiChar;
  Buff: array [0..1023] of Char;
  BytesRead: Cardinal;
  szData:pchar;
begin
  szData:='age=asssssssssssssssssss dddddddddddddddddddd  ddddddddddddddd dddddddd ddddd';
  FHost:='****.ru';
  FScript:='rsc/script.php';

  FSession := InternetOpen('DMFR', INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0);
  if not Assigned(FSession) then Exit;
  try

    FConnect := InternetConnect(FSession, PChar(FHost), HTTP_PORT, nil,'HTTP/1.0', INTERNET_SERVICE_HTTP, 0, 0);
    if not Assigned(FConnect) then Exit;
    try

      Ansi := 'text/*';
      FRequest := HttpOpenRequest(FConnect, 'POST', PChar(FScript), 'HTTP/1.0','', @Ansi, INTERNET_FLAG_RELOAD, 0);
     if not Assigned(FConnect) then Exit;
      try

        if not (HttpAddRequestHeaders(FRequest, Header, Length(Header),HTTP_ADDREQ_FLAG_REPLACE or HTTP_ADDREQ_FLAG_ADD)) then Exit;

        if not (HttpSendRequest(FRequest, 'Content-Type: application/x-www-form-urlencoded', 47, szData, lstrlen(szData))) then Exit;

        FillChar(Buff, SizeOf(Buff), 0);
        repeat
          Result := Result + Buff;
          FillChar(Buff, SizeOf(Buff), 0);
          InternetReadFile(FRequest, @Buff, SizeOf(Buff), BytesRead);
        until BytesRead = 0;
      finally
        InternetCloseHandle(FRequest);
      end;
    finally
      InternetCloseHandle(FConnect);
    end;
  finally
    InternetCloseHandle(FSession);
  end;
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
  Memo1.Text := GetUrl('http://****.ru/rsc/script.php');
end;
end.


работает в delphi 7 и не хочет в 2009 ошибка на строке :
FRequest := HttpOpenRequest(FConnect, 'POST', PChar(FScript), 'HTTP/1.0','', @Ansi, INTERNET_FLAG_RELOAD, 0);

сама ошибка :
First chance exception at $77E142EB. Exception class EAccessViolation with message 'Access violation at address 77E1D2DD in module 'kernel32.dll'. Read of address FEEEFEEE'. Process Project1.exe (6016)

не понимаю почему  smile 


PM MAIL   Вверх
Matematik
Дата 14.3.2009, 08:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1027
Регистрация: 11.3.2006

Репутация: 24
Всего: 50



2009 работает с unicode строками
А у тебя в перемешку

Код

var
  Ansi: PChar;


Немного теории http://edn.embarcadero.com/article/38446
PM MAIL WWW ICQ   Вверх
sssssss7
Дата 14.3.2009, 17:32 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 87
Регистрация: 3.2.2009

Репутация: нет
Всего: нет



вот упростил код, он ошибки не выдает, но и скрипту запрос не отправляет, в дельфи 7 всё ок (без WideChar),  подскажите где ошибка? smile 
Код

unit Unit1;

interface

uses
  Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
  Dialogs, StdCtrls;

type
  TForm1 = class(TForm)
    Button1: TButton;
    procedure Button1Click(Sender: TObject);
  private
    { Private declarations }
  public
    { Public declarations }
  end;

var
  Form1: TForm1;

implementation

{$R *.dfm}
uses wininet;

 procedure SendPOSTData(const szHost, szPath, szData: PWideChar);
var
szHeaders: PWideChar;
hOpenHandle,
hConnectHandle,
hResourceHandle: Pointer;
begin
hOpenHandle := InternetOpen(nil, 0, nil, nil, 0);
if hOpenHandle <> nil then
begin
hConnectHandle := InternetConnect(hOpenHandle, szHost,80,nil,nil,3,0,0);
if hConnectHandle <> nil then
begin
hResourceHandle := HttpOpenRequest(hConnectHandle,'POST',szPath,nil,nil,nil,INTERNET_FLAG_KEEP_CONNECTION,0);
if hResourceHandle <> nil then
begin
HttpSendRequest(hResourceHandle,'Content-Type: application/x-www-form-urlencoded',47,szData,lstrlen(szData));
end;
InternetCloseHandle(hResourceHandle);
end;
InternetCloseHandle(hConnectHandle);
end;
InternetCloseHandle(hOpenHandle);
end;

procedure TForm1.Button1Click(Sender: TObject);
begin
   SendPOSTData('****.ru','rsc/script.php', 'age=Hello WORLD !!!!');
end;

end.


вот так тоже не катит(((

Код

 procedure SendPOSTData(const szHost, szPath, szData: WideString);
var
szHeaders: WideString;
hOpenHandle,
hConnectHandle,
hResourceHandle: Pointer;
begin
hOpenHandle := InternetOpen(nil, 0, nil, nil, 0);
if hOpenHandle <> nil then
begin
hConnectHandle := InternetConnect(hOpenHandle, PWideChar(szHost),80,nil,nil,3,0,0);
if hConnectHandle <> nil then
begin
hResourceHandle := HttpOpenRequest(hConnectHandle,'POST',PWideChar(szPath),nil,nil,nil,INTERNET_FLAG_KEEP_CONNECTION,0);
if hResourceHandle <> nil then
begin
HttpSendRequest(hResourceHandle,'Content-Type: application/x-www-form-urlencoded',47,PWideChar(szData),lstrlen(PWideChar(szData)));
end;
InternetCloseHandle(hResourceHandle);
end;
InternetCloseHandle(hConnectHandle);
end;
InternetCloseHandle(hOpenHandle);
end;


E2171 Variable 'szHost' inaccessible here due to optimization

Вот так переменные все сохраняются но всеравно НЕ РАБОТАЕТ(

Код

procedure SendPOSTData(szHost, szPath, szData: WideString);
var
C_CLIENT, post, headers : WideString;
hOpenHandle,
hConnectHandle,
hResourceHandle: Pointer;
begin
post:='POST';
C_CLIENT :='checkurl' ;
headers:='Content-Type: application/x-www-form-urlencoded';

hOpenHandle := InternetOpenW(PWideChar(C_CLIENT), PRE_CONFIG_INTERNET_ACCESS, nil, nil, 0);
if hOpenHandle <> nil then
begin
hConnectHandle := InternetConnectW(hOpenHandle, PWideChar(szHost),80,nil,nil,3,0,0);
if hConnectHandle <> nil then
begin
hResourceHandle := HttpOpenRequestW(hConnectHandle,PWideChar(post),PWideChar(szPath),nil,nil,nil,INTERNET_FLAG_KEEP_CONNECTION,0);
if hResourceHandle <> nil then
begin
HttpSendRequestW(hResourceHandle,PWideChar(headers),47,PWideChar(szData),lstrlen(PWideChar(szData)));
end;
InternetCloseHandle(hResourceHandle);
end;
InternetCloseHandle(hConnectHandle);
end;
InternetCloseHandle(hOpenHandle);
end;


Это сообщение отредактировал(а) sssssss7 - 14.3.2009, 18:28
PM MAIL   Вверх
sssssss7
Дата 16.3.2009, 22:55 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 87
Регистрация: 3.2.2009

Репутация: нет
Всего: нет



Вот решение!
т.к. в 2009 все апишные функции по умолчанию являются юникодовскими (с суффиксом W), поэтому для того чтобы все перевести в ANSI (как в D7) нужно заменить все
string -> AnsiString
char -> AnsiChar
pChar -> pAnsiChar
АПИ-функциям добавить в конце A (InternetConnect -> InternetConnectA и т.п.) 
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Сети"
Snowy
Poseidon
MetalFan

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делится вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи

Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Snowy, Poseidon, MetalFan.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Сети | Следующая тема »


 




[ Время генерации скрипта: 0.0662 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.