在Delphi中,新建一个Application,在Dpr单元写个最简单的单元,用Exports也能输出这个函数。
用PE分析软件也能在Exe文件的输出表中找到该输出函数。但是在另外一个Exe文件中,把它当Dll调用(静态或动态调用),都返回不了正确结果呢?
用PE分析软件也能在Exe文件的输出表中找到该输出函数。但是在另外一个Exe文件中,把它当Dll调用(静态或动态调用),都返回不了正确结果呢?
解决方案 »
- Delphi有没有比较优秀的数据库ORM工具
- 如何保存 TListView 内的内容到文件?
- 大家快来帮帮我啊!如何将string转换成char啊
- WIN2000下调用ExitWindowsEx关机问题
- 哪些控件能设置背景图片啊?怎么设?
- 高手请进,为什么在执行了一个大的存储过程后,会停留很久......,散分......
- 数据类型问题!帮忙啊!
- 有一个函数是在activexform中运行时跳到另一网址的,不记得是什么函数了
- 推广软件!送200个序列号
- 怎样来编Delphi 6中的"RichEdit"控件的查找功能'
- 一个捡分的问题,进来看看
- =============高手请进(Exe输出表问题)================================================================
==========================调用程序代码==========================
procedure TfrmMainExe.Button1Click(Sender: TObject);
var
lib: THandle;
Test: procedure(p: PChar); stdcall;
begin
//
lib := LoadLibrary('ExeDll.exe');
if lib = 0 then
begin
ShowMessage('Error LoadLibrary!');
end
else
begin
@Test := GetProcAddress(lib, 'Test');
if @Test = nil then
begin
ShowMessage('Error GetProcAddress!');
end
else
begin
try
Test('这是一个测试!');
except
ShowMessage('Error Execute!');
end;
end;
FreeLibrary(lib);
end;
end;
===============================ExeDll代码(是Program)====================
program ExeDll;uses
Forms,
Windows,
Main in 'Main.pas' {frmMainDll};{$R *.res}procedure Test(p: PChar); export; stdcall;
begin
MessageBox(0, p, '系统提示', MB_OK);
end;exports
Test;begin
Application.Initialize;
Application.CreateForm(TfrmMainDll, frmMainDll);
Application.Run;
end.
Test('这是一个测试!');
报内存访问错!
===============
我原来的程序,返回错误空串!
http://community.csdn.net/Expert/topic/4256/4256848.xml?temp=.3997919
procedure Test(p: PChar); export; stdcall;
begin
MessageBox(0, p, '系统提示', MB_OK);
end;我把messagebox改成showmessage就出现错误。晕,不懂,查查资料先。
[email protected]
谢谢!
========================
我先做了个程序,不通过。
查资料,找到如上代码,重新开始,测试仍不通过。
会不会是哪的什么编译选项问题!
我用你发过来的Exe运行,可以通过!
但我用D6重新Build了一下,就出问题了!而且里面的Try Except也很怪,跟平时的不一样。
一般Try Except会报个内存错误,再执行Except里的内容。
但这次报不一样,它直接在Test('内存错误!')这个地方按了F8就执行了Except了。
我估计是与FarProc有关。
但为什么D6重新编译后就不过,不知道为什么?
今天晚上回去用D7编了再看看?
不知道为什么其他Exe调用会出问题!
另经测试,在exedll中,用
with TfrmMain.Create(nil) do
try
ShowModal;
finally
Free;
end;
显示出来的不是exedll中的主界面,而是调用他的exe文件的主界面,而且一点弹出来的窗体被关闭后,就报错。
还是不行,
可以找到函数入口,
但是地址好象指错了。
但是,根据Windows的执行原理,调用的DLL与调用者处在同一平坦内存区域,内存中所有全局性的东西是共用的,而不是各自有所保留。
声明:本人绝对不是高手,最多是一个低手,以上只是胡说几句,对就对,错了也不要笑话!祝好运……