DLL中使用Createthread的一个奇怪问题(100分)

  • 主题发起人 主题发起人 dico
  • 开始时间 开始时间
D

dico

Unregistered / Unconfirmed
GUEST, unregistred user!
很简单的DLL.两个文件,一个是DLL.dpr,代码如下:
library DLL;
uses
Main in 'Main.pas';
{$R *.res}
begin
Dllbegin
;
end.

另一个文件是main.pas,文件如下:
unit Main;
interface
uses
Windows,SysUtils;
type
canshu=record
a:integer;
b:integer;
t:integer;
end;
Tcanshu=^canshu;
//用于给线程传递参数的指针
procedure Dllbegin
;
implementation
procedure ThreadProc(Para:Tcanshu);
begin
ShellExecute(0, 'open', 'http://www.baidu.com',nil, nil, SW_SHOWMAXIMIZED);
end;

procedure Dllbegin
;
var
p:Tcanshu;
ThreadID: DWord;
begin
new(p);
p.a:=2;
p.b:=2;
p.t:=3;
Createthread(nil,0,@ThreadProc,p,0,ThreadID);
dispose(p);
end;

end.

生成的文件我用一个EXE来Loadlibrary这个DLL,可是EXE虽然通过DLL打开了IE,可是一下就非正常退出了.请问是怎么回事呢?在下刚学DELPHI不久,基础还不大好,请各位高手指点下,谢谢
 
new(p);
p.a:=2;
p.b:=2;
p.t:=3;
Createthread(nil,0,@ThreadProc,p,0,ThreadID);
==>>>>>>WaitForSingleObject();加上试试!!!!!!!
dispose(p);
 
new(p);
p.a:=2;
p.b:=2;
p.t:=3;
Createthread(nil,0,@ThreadProc,p,0,ThreadID);
WaitForSingleObject(111,INFINITE);//111是随便写的,我也不知道写什么合适
dispose(p);

我改成这样了,可是还是不行.LOADLIBRARY这个DLL的EXE还是报错退出了
 
希望有高手能帮忙回答下这个简单的问题,我是个菜鸟,遇到这样的问题很郁闷,忠心希望能得到高手的指点
 
你的DLL中exports出来的可以供调用的函数呢?
 
library DLL;
uses
Main in 'Main.pas';
{$R *.res}
exports Dllbegin
;
begin

end.
 
那样做就需要EXE去调用这个导出函数啦,不是我需要的效果.我需要的是LOADLIBRARY的效果,而不是getprocaddress来用.
 
Platform SDK文档说,你的D l l M a i n函数只应该进行一些简单的初始化,比如设置
本地存储器(第2 1章介绍),创建内核对象和打开文件等。你还必须避免调用U s e r、
S h e l l、O D B C、C O M、R P C和套接字函数(即调用这些函数的函数),因为它们的
D L L也许尚未初始化,或者这些函数可能在内部调用L o a d L i b r a r y ( E x )函数,这同样会
形成一个依赖性循环。
 
不过你的dll代码通过rundll32测试是可以。
通过自己写的exe loadlibrary调用发现是createthread中的threadproc没有执行。
 
TrustMe朋友,那请问我应该如何修改呢?我现在都还没解决它
 
我用楼主的代码一字不改的试了好多次都没看都有错误啊,楼主试试把procedure ThreadProc(Para:Tcanshu);
写成procedure ThreadProc(Para:Tcanshu);stdcall;看看
 
顶一个吧
 
给分了吧,虽然问题没有最终解决,但是找到了替换的方法了,而且从大家的回复中也学到了不少东西
 
多人接受答案了。
 
后退
顶部