Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Перевод программы с Си на Delphi 
:(
    Опции темы
Гость_Виктор
Дата 23.12.2003, 20:04 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Може кто-то помочь с переводом сишного кода на Delphi?

BOOL GetRemoteFile (HINTERNET IN hOpen, TCHAR * IN szUrl, TCHAR * IN szFileName )
{
DWORD dwLength, dWritten, dwCode, dwSize;
SECURITY_ATTRIBUTES sa = {sizeof(SECURITY_ATTRIBUTES), NULL, FALSE};
HANDLE hFile;
HINTERNET hConnect;
BOOL bInitalRequest = TRUE;
CHAR *szBuffer;

if ( !(hConnect = InternetOpenUrl ( hOpen, szUrl , NULL, 0,
INTERNET_FLAG_DONT_CACHE |
INTERNET_FLAG_KEEP_CONNECTION |
INTERNET_FLAG_RELOAD, 0) ) )
{
ErrorOut (GetLastError (), TEXT ("InternetOpenUrl"));
return 0;
}

again:

if (!bInitalRequest)
{
if ( !HttpSendRequest (hConnect, NULL,0,NULL, 0))
{
ErrorOut (GetLastError(), "HttpSendRequest");
return FALSE;
}
}
dwSize = sizeof (dwCode);
if ( !InternetQueryOption (hConnect, INTERNET_OPTION_HANDLE_TYPE ,
&dwCode, &dwSize))
{
ErrorOut (GetLastError(), "HttpQueryInfo");
return FALSE;
}

if ( (dwCode == INTERNET_HANDLE_TYPE_HTTP_REQUEST ) ||
(dwCode == INTERNET_HANDLE_TYPE_CONNECT_HTTP ) )
{
// if were are here, it means that we use HTTP to talk the proxy
dwSize = sizeof (DWORD) ;
if ( !HttpQueryInfo (hConnect, HTTP_QUERY_STATUS_CODE | HTTP_QUERY_FLAG_NUMBER,
&dwCode, &dwSize, NULL))
{
ErrorOut (GetLastError(), "HttpQueryInfo");
return FALSE;
}

if ( dwCode == HTTP_STATUS_PROXY_AUTH_REQ)
{
if (!InternetQueryDataAvailable (hConnect, &dwLength, 0,0) )
{
ErrorOut (GetLastError (), "InternetQueryDataAvailable");
return FALSE;
}

szBuffer = new CHAR [dwLength];
// read all the data and ignore it
do
{
InternetReadFile (hConnect, szBuffer, dwLength, &dwSize);
}
while (dwSize != 0);
delete [] szBuffer;

if (!bUI)
{
// This is a secure page.
cerr << "Proxy authentication is required." << endl;
CHAR szUser[50]="";
CHAR szPass[50]="";

cerr << "User: ";
cin >> szUser;
cerr << "Pass: ";
cin >> szPass;
if ( !InternetSetOption (hConnect, INTERNET_OPTION_PROXY_USERNAME, (LPVOID) szUser, lstrlen (szUser) ))
{
cerr << "InternetSetOptionFailed: " << GetLastError() << endl;
return FALSE;
}

if ( !InternetSetOption (hConnect, INTERNET_OPTION_PROXY_PASSWORD, (LPVOID) szPass, lstrlen (szPass) ))
{
cerr << "InternetSetOptionFailed: " << GetLastError() << endl;
return FALSE;
}
bInitalRequest = FALSE;
goto again;
}
else
{
if ( InternetErrorDlg (GetDesktopWindow(),
hConnect,
ERROR_INTERNET_INCORRECT_PASSWORD,
FLAGS_ERROR_UI_FILTER_FOR_ERRORS |
FLAGS_ERROR_UI_FLAGS_GENERATE_DATA |
FLAGS_ERROR_UI_FLAGS_CHANGE_OPTIONS,
NULL) == ERROR_INTERNET_FORCE_RETRY)
{
bInitalRequest = FALSE;
goto again;
}
} // else
} // if ( dwCode == HTTP_STATUS_PROXY_AUTH_REQ
} // if ( (dwCode == INTERNET_HANDLE_TYPE_HTTP_REQUEST

if ( (hFile = CreateFile (szFileName,
GENERIC_WRITE,
FILE_SHARE_READ,
&sa,
CREATE_ALWAYS,
FILE_ATTRIBUTE_NORMAL, NULL) ) == INVALID_HANDLE_VALUE)
{
cerr << "Can't open file file: " << szFileName << endl;
return FALSE;
}

if (!InternetQueryDataAvailable (hConnect, &dwLength, 0,0) )
{
ErrorOut (GetLastError (), "InternetQueryDataAvailable");
return FALSE;
}

szBuffer = new CHAR [dwLength];

do
{
if (!InternetReadFile (hConnect, szBuffer, dwLength, &dWritten) )
{
CloseHandle (hFile);
ErrorOut (GetLastError (), "InternetReadFile");
delete [] szBuffer;
return FALSE;
}

if (!dWritten)
break;
else
if (!WriteFile(hFile, szBuffer, dWritten , &dwSize, NULL))
{
CloseHandle (hFile);
cerr << "error " << GetLastError () << endl;
delete [] szBuffer;
return FALSE;
}
}
while (TRUE);
FlushFileBuffers (hFile);
CloseHandle (hFile);
delete [] szBuffer;
return 1;
}
  Вверх
NiJazz
Дата 24.12.2003, 00:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Jazz coder
****


Профиль
Группа: Экс. модератор
Сообщений: 2286
Регистрация: 10.8.2003
Где: Москва

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



Тебе именно прога нужна или функции этого кода? Если функции, то сделай dll, а там в делфе её используй.
PM MAIL   Вверх
Paradox
Дата 24.12.2003, 06:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


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

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



Тут я смотрю апишные ф-ии кое-где есть, так от в дельфях они тоже есть, посмотри в хелпах


--------------------
---
PM MAIL WWW   Вверх
Гость_Виктор
Дата 25.12.2003, 13:37 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Проблемы с некоторыми типами,структурами...
Например :
SECURITY_ATTRIBUTES sa = {sizeof(SECURITY_ATTRIBUTES), NULL, FALSE};
Как в делфи описать...? Вот с этим у меня проблемы...
  Вверх
<Spawn>
Дата 25.12.2003, 14:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

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



в Дельфи определена уже эта SECURITY_ATTRIBUTES. Загляни в Windows.pas:

Код
 PSecurityAttributes = ^TSecurityAttributes;
 _SECURITY_ATTRIBUTES = record
   nLength: DWORD;
   lpSecurityDescriptor: Pointer;
   bInheritHandle: BOOL;
 end;
 {$EXTERNALSYM _SECURITY_ATTRIBUTES}
 TSecurityAttributes = _SECURITY_ATTRIBUTES;
 SECURITY_ATTRIBUTES = _SECURITY_ATTRIBUTES;


Тогда это все преобразуется в такой код:

Код
var
sa: TSecurityAttributes;
begin
sa.nLength:= SizeOf(TSecurityAttributes);
sa.lpSecurityDescriptor:= nil;
sa.bInheritHandle:= False;



--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
Гость_Виктор
Дата 25.12.2003, 14:36 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Спасибо, <Spawn>... Попробую
  Вверх
<Spawn>
Дата 25.12.2003, 14:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

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



Я тебе перевел до bUI, т.к. эта переменная тут неопределена.
Код
uses
 SysUtils,
 Windows,
 Messages,
 Wininet;

 function GetRemoteFIle(hOpen: HINTERNET; szUrl: PChar; szFileName: string):Boolean;
 label
   again;
 var
   dwLength, dwWritten, dwCode, dwSize: DWORD;
   Sa: TSecurityAttributes;
   hFile: THandle;
   hConnect: HINTERNET;
   bInitialRequest: Boolean;
   szBuffer: PChar;
   lpdwReserved: Cardinal;
 begin
   bInitialRequest:= True;
   Sa.nLength:= SizeOf(TSecurityAttributes);
   Sa.lpSecurityDescriptor:= nil;
   Sa.bInheritHandle:= False;
   hConnect:= InternetOpenUrl(hOpen, szUrl, nil, 0, INTERNET_FLAG_DONT_CACHE or
              INTERNET_FLAG_KEEP_CONNECTION or
              INTERNET_FLAG_RELOAD, 0);
   if not Assigned(hConnect) then
   begin
     //call ErrorOut(GetLastError, "InternetOpenUrl");
     Result:= False;
     Exit;
   end;

   again:

   if not bInitialRequest then
     if not HttpSendRequest(hConnect, nil, 0, nil, 0) then
     begin
       // call ErrorOut(GetLastError, "HttpSendRequest");
       Result:= False;
       Exit;
     end;

   dwSize:= SizeOf(dwCode);
   if not InternetQueryOption(hConnect, INTERNET_OPTION_HANDLE_TYPE, @dwCode, dwSize) then
   begin
     //call ErrorOut(GetLastError, "InternetQueryOption");
     Result:= False;
     Exit;
   end;

   if (dwCode = INTERNET_HANDLE_TYPE_HTTP_REQUEST) or
      (dwCode = INTERNET_HANDLE_TYPE_CONNECT_HTTP) then
   begin
     dwSize:= SizeOf(DWORD);
     if not HttpQueryInfo(hConnect, HTTP_QUERY_STATUS_CODE or HTTP_QUERY_FLAG_NUMBER,
                          @dwCode, dwSize, lpdwReserved) then
     begin
       //call ErrorOut(GetLastError, "HttpQueryInfo")
       Result:= False;
       Exit;
     end;

     if dwCode = HTTP_STATUS_PROXY_AUTH_REQ then
       if not InternetQueryDataAvailable(hConnect, dwLength, 0, 0) then
       begin
         //call ErrorOut(GetLastError, "IntenetQueryDataAvailable")
         Result:= False;
         Exit;
       end;

     try
       GetMem(szBuffer, dwLength);
       repeat
         InternetReadFile(hConnect, szBuffer, dwLength, dwSize);
       until dwSize = 0;
     finally
       FreeMem(szBuffer);
     end;

   end;

 end;


Это сообщение отредактировал(а) <Spawn> - 25.12.2003, 14:50


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
Гость_Виктор
Дата 25.12.2003, 16:55 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











<Spawn>
Еще раз спасибо. если не трудно помоги еще вот с этим...

1) ....(LPVOID) szUser, lstrlen (szUser));

2) if ( InternetErrorDlg (GetDesktopWindow(),
hConnect,
ERROR_INTERNET_INCORRECT_PASSWORD,
FLAGS_ERROR_UI_FILTER_FOR_ERRORS |
FLAGS_ERROR_UI_FLAGS_GENERATE_DATA |
FLAGS_ERROR_UI_FLAGS_CHANGE_OPTIONS,
NULL) == ERROR_INTERNET_FORCE_RETRY)

Я пробовал вот-так
if InternetErrorDlg(GetDesktopWindow(),
hConnect,
ERROR_INTERNET_INCORRECT_PASSWORD,
FLAGS_ERROR_UI_FILTER_FOR_ERRORS or
FLAGS_ERROR_UI_FLAGS_GENERATE_DATA or
FLAGS_ERROR_UI_FLAGS_CHANGE_OPTIONS,
nil) = error_internet_force_retry then

[Error] Unit1.pas(544): Types of actual and formal var para
meters must be identical

  Вверх
<Spawn>
Дата 25.12.2003, 18:50 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

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



1)
Код
 if  not InternetSetOption (hConnect, INTERNET_OPTION_PROXY_USERNAME, @szUser[0], lstrlen (szUser) ) then


2) Необходимо передать параметр по ссылке
Код
lppvData: Pointer;
  ...
  lppvData:= nil;
   if  InternetErrorDlg (GetDesktopWindow(),
                         hConnect,
                         ERROR_INTERNET_INCORRECT_PASSWORD,
                         FLAGS_ERROR_UI_FILTER_FOR_ERRORS or
                         FLAGS_ERROR_UI_FLAGS_GENERATE_DATA or
                         FLAGS_ERROR_UI_FLAGS_CHANGE_OPTIONS,
                         lppvData) = ERROR_INTERNET_FORCE_RETRY then


Это сообщение отредактировал(а) <Spawn> - 25.12.2003, 18:52


--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
Гость_Viktor
Дата 26.12.2003, 13:46 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered












<Spawn> Что я неправильно делаю?

if not (WriteFile(hFile, szBuffer,dWritten, @dwSize, nil)) then ....

[Error] Unit1.pas(554): Types of actual and formal var parameters must be identical
  Вверх
<Spawn>
Дата 26.12.2003, 14:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Око кары:)
****


Профиль
Группа: Экс. модератор
Сообщений: 2776
Регистрация: 29.1.2003
Где: Екатеринбург

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



Не нужно использовать оператор взятия адреса. Там необходимо передать значение по ссылке(var ...).

Код
if not (WriteFile(hFile, szBuffer,dWritten, dwSize, nil)) then ....



--------------------
"Для некоторых людей программирование является такой же внутренней потребностью, подобно тому, как коровы дают молоко, или писатели стремятся писать" - Николай Безруков.
PM MAIL ICQ   Вверх
Гость_Viktor
Дата 26.12.2003, 14:58 (ссылка)    |    (голосов: 0) Загрузка ... Загрузка ... Быстрая цитата Цитата


Unregistered











Понял, спасибо <Spawn>
  Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

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


 




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


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

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