قسمت آخر فرستادن پیام از یه برنامه دیگه به این برنامه است؛ برای اینکار همونطوریکه در بند قبل دیدین، باید آدرس رشته موردنظر رو به برنامه سرور بدین؛ برای اینکار من از رشته مورد نظر یه instance تو RAM درست میکنم و اون آدرس رو به روال هندل پیام که تو بند قبل نوشتیم میدم :
(*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*)
procedure SendMyMessage(wHnd: THandle; mess: string);
var
function strdup(s: string): PChar;
begin
Result := AllocMem(Length(s) + 1);
StrPCopy(Result, s);
end;
begin
// wHnd is your server handle
PostMessage(wHnd, TH_EVENT_OUT_MESSAGE, WPARAM(strdup(mess)), 0);
end;
(*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*)
البته باید توجه کنید که برای استفاده از این تابع باید هندل سرور رو داشته باشید، که روش اینکار درصورت جستجو همه جا هست، برای نمونه هم تو سایت Torry میتونید یه نمونه اش رو پیدا کنید، ولی با فرض اینکه شما یه instance از سرورتون دارین میتونید از یکی از توابع زیر برای اینکار استفاده کنید (توجه کنید که تابع اول برای موقعی هست که سرور تو یه ماشین دیگه اس ...) :
(*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*)
function GetPid(sService: String; sMachine: String = '') : Cardinal;
var
schm,
schs: SC_Handle;
SC_STATUS_TYPE: Cardinal;
lpBuffer: _SERVICE_STATUS_PROCESS;
cbBufSize: DWORD;
pcbBytesNeeded: LPDWORD;
begin
//open the service manager (defined in WinSvc)
schm := OpenSCManager(PChar(sMachine), nil, SC_MANAGER_CONNECT);
//set the status type to SC_STATUS_PROCESS_INFO
//this is currently the only value supported
SC_STATUS_TYPE := $00000000;
//set the buffer size to the size of the record
cbBufSize := sizeof(_SERVICE_STATUS_PROCESS);
if (schm>0) then
begin
//grab the service handle
schs := OpenService(schm, PChar(sService), SERVICE_QUERY_STATUS);
if (schs>0) then
begin
//call the function
QueryServiceStatusEx(
schs,
SC_STATUS_TYPE,
lpBuffer,
cbBufSize,
pcbBytesNeeded);
CloseServiceHandle(schs);
end;
CloseServiceHandle(schm);
end;
Result := lpBuffer.dwProcessId;
end;
(*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*)
function GetProcessID(ProcessName:string):Integer;
var
Handle:tHandle;
Process:tProcessEntry32;
GotProcess:Boolean;
begin
Handle:=CreateToolHelp32SnapShot(TH32CS_SNAPALL,0) ;
Process.dwSize:=SizeOf(Process);
GotProcess := Process32First(Handle,Process);
{$B-}
if GotProcess and (Process.szExeFile<>ProcessName) then
repeat
GotProcess := Process32Next(Handle,Process);
until (not GotProcess) or (Process.szExeFile=ProcessName);
{$B+}
if GotProcess then Result := Process.th32ProcessID
else Result := 0;
CloseHandle(Handle);
end;
(*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*-*)