当前位置:主页>销售管理软件> 列表

有人对远程线程比较了解嘛? 找财务管理

销售管理软件版1楼: 我在用远程线程向一个进程插入了一个DLL

这个DLL的内容只有
begin
Form1:=TForm1.Create(nil);
Form1.Show;
end.

远程线程在跑完了DLLMAIN 就是上面那段代码之后就退出了
Form1也跟着消失了,好像被free了一样,里面的控件也跟着失效了(例如timer)

EXE的代码是
function ToProcess(const HostFile,GuestFile:string;const PID:DWORD=0):DWORD;
//HostFile为要绑定的宿主文件(Exe文件),GuestFile为要嵌入的客户文件(Dll文件)
//如AttachToProcess(''Notepad.exe'',''D:\TESTDLL.DLL'');
var
hRemoteProcess:THandle;
dwRemoteProcessId:DWORD;
cb:DWORD;
pszLibFileRemote:Pointer;
iReturnCode:Boolean;
TempVar:DWORD;
pfnStartAddr:TFNThreadStartRoutine;
pszLibAFilename:PwideChar;
begin
Result:=0;
Getmem(pszLibAFilename,Length(GuestFile)*2+1);
StringToWideChar(GuestFile,pszLibAFilename,Length(GuestFile)*2+1);

if PID > 0 then dwRemoteProcessID:=PID else FindAProcess(HostFile,False,dwRemoteProcessID);
{ hRemoteProcess:=OpenProcess(PROCESS_CREATE_THREAD+//允许远程创建线程
PROCESS_VM_OPERATION+//允许远程VM操作
PROCESS_VM_WRITE,//允许远程VM写
FALSE,dwRemoteProcessId); }

hRemoteProcess:=OpenProcess(PROCESS_ALL_ACCESS,FALSE,dwRemoteProcessId);
//计算DLL路径名需要的内存空间
cb:=(1+lstrlenW(pszLibAFilename))*sizeof(WCHAR);
//使用VirtualAllocEx函数在远程进程的内存地址空间分配DLL文件名缓冲区
pszLibFileRemote:=PWIDESTRING(VirtualAllocEx(hRemoteProcess,nil,cb,MEM_COMMIT,PAGE_READWRITE));
//使用WriteProcessMemory函数将DLL的路径名复制到远程进程的内存空间
TempVar:=0;
iReturnCode:=WriteProcessMemory(hRemoteProcess,pszLibFileRemote,pszLibAFilename,cb,TempVar);
if iReturnCode then
begin
//计算LoadLibraryW的入口地址
pfnStartAddr:=GetProcAddress(GetModuleHandle(''Kernel32''),''LoadLibraryW'');
//启动远程线程LoadLibraryW,通过远程线程调用用户的DLL文件
TempVar:=0;
Result:=CreateRemoteThread(hRemoteProcess,nil,0,pfnStartAddr,pszLibFileRemote,0,TempVar);
end;
WaitForSingleObject(Result, INFINITE);

Freemem(pszLibAFilename);
CloseHandle(hRemoteProcess);
CloseHandle(Result);
VirtualFreeEx(hRemoteProcess, pszLibFileRemote, 0, MEM_RELEASE);
end;

那么如何使得这个DLL里的Form1能够不被free呢??
谢谢大家了

2楼: DllMain再建立一个线程, 由这个线程创建窗口并且作消息循环, 即可…… 如财务管理

3楼: 谢谢 这个我已经试过了 先创建了一个线程用的是delphi给的线程控件 然后我定义的线程中创建窗口 但是同样的结果 连线程也被free了

4楼: 不过或许是我的方法不对 请刘大哥能不能写一个简单的源代码 我欣赏下 谢谢

5楼: 我的源代码
工程文件里的:
library Project2;

{ Important... }

uses
SysUtils,
Classes,
Unit2 in ''Unit2.pas'' {Form2};

{$R *.res}

begin
Main:=TMain.Create(True);
Main.FreeOnTerminate := False;
Main.Resume;
end.

单元文件里的:
unit Unit2;

interface

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

type
TForm2 = class(TForm)
procedure FormCreate(Sender: TObject);
private
{ Private declarations }
public
{ Public declarations }
end;

type
Tmain = class(TThread)
private
{ Private declarations }
protected
procedure Execute; override;
end;

var
Form2: TForm2;
main: TMain;
implementation

{$R *.dfm}

Procedure TMain.Execute;
begin
Form2:=TForm2.Create(Form2);
Form2.Show;
end;

procedure TForm2.FormCreate(Sender: TObject);
begin
showmessage(''1122'');
end;

end.

运行结果是(比如目标进程是notepad.exe)弹了个窗(showmessage)后主窗口(From2)一闪就消失了,但是notepad的窗口正常

6楼: 这个是用消息钩子进去的, http://www.2ccc.com/article.asp?articleid=1717

销售管理软件版7楼: 你的代码可以这样改:

Procedure TMain.Execute;
var
Msg: TMsg;
begin
Form2:=TForm2.Create(Form2);
Form2.Show;

while GetMessage(Msg, 0, 0, 0) do
begin
TranslateMessage(Msg);
DispatchMessage(Msg);
end;
end;

8楼: 楼主失踪了???

9楼: 麻子大哥
你改的那一段 怎么不好使呀
而且http://www.2ccc.com/article.asp?articleid=1717 这个程序中一放入窗体的话
怎么有的机器不好使呀.请教麻子大哥 给一个更好点的例子.
万分感谢!!!!!!!!!!!!!

10楼: 帮顶!

╭=========================================╮

80G海量源代码,控件,书籍全免费狂下不停!

http://www.source520.com

╰=========================================╯

11楼: 接受答案了.