Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей.
Здесь обсуждаются безопасность, программирование, технологии и многое другое.
Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
 |
|

28.06.2007, 20:14
|
|
Новичок
Регистрация: 25.06.2007
Сообщений: 5
Провел на форуме: 20234
Репутация:
11
|
|
Delphi: communication
I have 2 questions about communication
1) I have 2 applications ( one as proccess, 2-nd as injected dll somewhere)
How can they communicate?
2) I have to transmit data throught web and parse result.
I am using this function do that, but when it is used, application freezes for some time. how can do that, without freezing application
Код:
function GetInetPageSRC(const fileURL: String): string;
const
BufferSize = 1024;
var
hSession, hURL: HInternet;
Buffer: array[1..BufferSize] of char;
BufferLen: DWORD;
sAppName: string;
begin
Result := '';
sAppName := ExtractFileName(Application.ExeName) ;
hSession := InternetOpen(PChar(sAppName), INTERNET_OPEN_TYPE_PRECONFIG, nil, nil, 0) ;
try
hURL := InternetOpenURL(hSession, PChar(fileURL), nil, 0, 0, 0) ;
try
repeat
InternetReadFile(hURL, @Buffer, SizeOf(Buffer), BufferLen);
Result := Result + Copy(string(Buffer),1,BufferLen);
until (BufferLen = 0) OR (length(string(Buffer)) = 0);
finally
InternetCloseHandle(hURL)
end
finally
InternetCloseHandle(hSession)
end
end;
P.S> You can answer in russian
|
|
|

28.06.2007, 21:29
|
|
Флудер
Регистрация: 27.12.2005
Сообщений: 2,372
Провел на форуме: 5339610
Репутация:
4360
|
|
1) I have 2 applications ( one as proccess, 2-nd as injected dll somewhere)
How can they communicate?
Да как угодно. Pipes; mapped files; да хоть Read/WriteProcessMemory..
how can do that, without freezing application
Делай все свои грязные дела в отдельном потоке, а главный пусть дальше обрабатывает сообщения.
То есть в обработчике кнопки надо написать CreateThread, а в потоке делать все остальное.
|
|
|

28.06.2007, 21:40
|
|
Новичок
Регистрация: 25.06.2007
Сообщений: 5
Провел на форуме: 20234
Репутация:
11
|
|
I foggot say, that i am an idiot
can you give small examples, because i am learning delphi only week
|
|
|

28.06.2007, 22:18
|
|
Reservists Of Antichat - Level 6
Регистрация: 12.02.2006
Сообщений: 891
Провел на форуме: 1892597
Репутация:
836
|
|
Only week???!!!!
It's really your code???
__________________
*********************************
*Я не волшебник ٩(๏̯͡๏)۶, только учусь...*
*********************************
Программы на заказ
Times to fly...
|
|
|

29.06.2007, 14:23
|
|
Новичок
Регистрация: 25.06.2007
Сообщений: 5
Провел на форуме: 20234
Репутация:
11
|
|
Only some parts
|
|
|

29.06.2007, 16:23
|
|
Новичок
Регистрация: 04.01.2007
Сообщений: 24
Провел на форуме: 100525
Репутация:
46
|
|
Делай все свои грязные дела в отдельном потоке, а главный пусть дальше обрабатывает сообщения.
То есть в обработчике кнопки надо написать CreateThread, а в потоке делать все остальное.
это будет примерно так:
procedure Thr;
begin
// твои грязные дела
ExitThread(0); // самостоятельное завершение потока
end;
var hThr: dword;
begin
CreateThread(nil,0,@Thr,nil,0,hThr); // создание потока Thr
// ... выполнение главного потока дальше
// TerminateThread(hThr,0); // принудительное завершение потока Thr
end;
|
|
|

29.06.2007, 16:34
|
|
Флудер
Регистрация: 27.12.2005
Сообщений: 2,372
Провел на форуме: 5339610
Репутация:
4360
|
|
Можно обойтись и без ExitThread, который за тебя заботливо сделает kernel32!BaseThreadStart
PS. Я с дельфи не оч дружу, но мб CreateThread(nil,0,@Thr,nil,0,hThr); здесь нужно @hThr, чтобы адрес переменной передать?
|
|
|

29.06.2007, 17:43
|
|
Новичок
Регистрация: 04.01.2007
Сообщений: 24
Провел на форуме: 100525
Репутация:
46
|
|
PS. Я с дельфи не оч дружу, но мб CreateThread(nil,0,@Thr,nil,0,hThr); здесь нужно @hThr, чтобы адрес переменной передать?
нет не нужно...
в windows.pas:
function CreateThread(lpThreadAttributes: Pointer;
dwStackSize: DWORD; lpStartAddress: TFNThreadStartRoutine;
lpParameter: Pointer; dwCreationFlags: DWORD; var lpThreadId: DWORD): THandle;
"var lpThreadId: DWORD" => var означает что нужно передавать не адрес, т.к. компилятор сам заменит переменную на адрес, если было бы так "lpThreadId: Pointer", или вон посмотри при передачи параметра lpParameter: Pointer, тогда да адрес @hThr...
|
|
|

29.06.2007, 17:55
|
|
Флудер
Регистрация: 27.12.2005
Сообщений: 2,372
Провел на форуме: 5339610
Репутация:
4360
|
|
Последний параметр CreateThread по смыслу - адрес переменной, куда положить нужно ид потока. Ты уверен что оно само заменит hThr на адрес hThr ?
UPD: Там стоит var, не заметил. Значит, всетаки передастся адрес.
Последний раз редактировалось _Great_; 29.06.2007 в 18:13..
|
|
|

29.06.2007, 18:10
|
|
Участник форума
Регистрация: 09.12.2006
Сообщений: 135
Провел на форуме: 426226
Репутация:
726
|
|
Ну а я про общение процессов пример приведу.
Правда не понял на каком языке общаться.
I prefer named mapped virtual memory
Код:
const
sizebufo=$100000;
C_ReadFile=5;
type
my_virt_mem=record
command:dword;
sizeblock:dword;
bufo:array [0..sizebufo] of byte;
end;
var
fmo,host:dword;
virtbuf:^my_virt_mem;
begin
// process headline (within each process)
host:=0;
fmo:=OpenFileMapping(FILE_MAP_WRITE or FILE_MAP_READ,true,'my_original_name');
if fmo=0 then begin// first run
fmo:=CreateFileMapping($ffffffff,0,SEC_COMMIT or PAGE_READWRITE,0,sizebufo,'my_original_name');
host:=1; end;
virtbuf:=MapViewOfFile(fmo,SECTION_MAP_READ or SECTION_MAP_WRITE,0,0,0);
if virtbuf=nil then exit;
//-----------------------
if host=1 then begin // host process
virtbuf^.command:=C_ReadFile;
while virtbuf^.command<>0 do sleep(100);
end;
if host=0 then begin // slave process
while virtbuf^.command=0 do sleep(100);
case virtbuf^.command of
C_ReadFile: begin
//I have no component InternetReadFileFromUrlAdnSaveToBuffer
//InternetReadFile(hURL,@virtbuf^.bufo,sizebufo,virtbuf^.sizeblock);
virtbuf^.command:=0;
end;
end; // case
end;
|
|
|
|
 |
|
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|