我用c++builder生成的DLL文件,为什么delphi调用不了了啊 ( 积分: 200 )

  • 主题发起人 主题发起人 francais
  • 开始时间 开始时间
F

francais

Unregistered / Unconfirmed
GUEST, unregistred user!
我在c++builder下生成了一个DLL文件,然后在delphi下调用这个DLL文件,结果编译的时候都没有错,但运行时报错说
“无法定位程序输入点Say于动态链接库SimpleDll.dll上。”
我在delphi下的函数声明是:
procedure Say(WhatToSay: string)
stdcall
far
external 'SimpleDLL.dll';
在c++builder的h文件下的函数声明是:
extern "C&quot
void __declspec(dllexport) Say(char *WhaStToSay);
在c++builder的cpp文件下的函数定义是:
void Say(char *WhatToSay)
{
ShowMessage("This is from within the DLL /n &quot
+ (String)WhatToSay);
}
这个DLL在c++builder下能调用成功。
请问,问题出在哪里啊?
我都试了好长时间,好像也没什么进展,望指点,谢谢!
 
我在c++builder下生成了一个DLL文件,然后在delphi下调用这个DLL文件,结果编译的时候都没有错,但运行时报错说
“无法定位程序输入点Say于动态链接库SimpleDll.dll上。”
我在delphi下的函数声明是:
procedure Say(WhatToSay: string)
stdcall
far
external 'SimpleDLL.dll';
在c++builder的h文件下的函数声明是:
extern "C&quot
void __declspec(dllexport) Say(char *WhaStToSay);
在c++builder的cpp文件下的函数定义是:
void Say(char *WhatToSay)
{
ShowMessage("This is from within the DLL /n &quot
+ (String)WhatToSay);
}
这个DLL在c++builder下能调用成功。
请问,问题出在哪里啊?
我都试了好长时间,好像也没什么进展,望指点,谢谢!
 
procedure Say(WhatToSay: string)
stdcall
far
external 'SimpleDLL.dll' name 'Say';

试试!

调用时delphi的类型要匹配哦:Say(char *WhatToSay)
 
用PE EXPLORER察看一下DLL的导出函数/EXE的导入函数.确定名字一样.
 
有时候导出函数名是乱的,可以在Dos下面用Dumpbin /exports xxx.dll 看导出函数对了,另外就是要确定是Release版本
 
客户用delphi调用MWTokenAPI接口,第一个函数就返回“无法定位程序输入点MWTOKENLIST于动态库MWTOKENAPI.DLL”。

是否MWTokenAPI接口不支持其它编程语言(编译时没有加 WINAPI、或__stdcall),还是其它原因?

这样有启示没有????
 
最好不用 string 座参数,改为pchar
 
谢谢各位解答,都让我长见识了!
我用Dumpbin /exports xxx.dll命令查看了一下,发现函数名变成了_Say,然后就改了一下我的声明:
procedure Say(WhatToSay: PChar)
stdcall
far
external 'SimpleDLL.dll' name '_Say';
结果程序能正常执行了!!!
不过又出了新的问题,执行完Say函数后程序报错,Delphi先报错:
---------------------------
Debugger Exception Notification
---------------------------
Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address 00F43960. Write of address 0044ED1C'. Process stopped. Use Step or Run to continue.
---------------------------
OK Help
---------------------------
点OK后程序报错:
---------------------------
Project1
---------------------------
Access violation at address 00F43960. Write of address 0044ED1C.
---------------------------
确定
---------------------------
后来我又试了一下,把CBC中的函数声明改为,完成简单加1的功能:
extern "C&quot
int __declspec(dllexport) AddOne(int i);
结果运行时报错:
---------------------------
Information
---------------------------
Project F:/pro_delphi/µ÷ÓÃDLL/Project1.exe faulted with message: 'access violation at 0x0012f6fd: write of address 0x00000001'. Process Stopped. Use Step or Run to continue.
---------------------------
OK
---------------------------
然后就跳出CPU的窗口了。
我实在对DLL不是很熟悉,出了这样的问题也不知道是哪里的问题,只能自己瞎试,尽量把现象说出来,希望大家帮忙!!!
上面大家的回帖都很有价值,谢谢大家!!!大家不闲麻烦的话,回头再多给大家一些分,谢谢!
 
另外,三楼说的PE EXPLORER是一个小程序吗?还是Delphi自带的工具?
如果是个小程序的话,名字就是PE EXPLORER吗?
谢谢
 
在Delphi的Bin目录有一个TDump 道理差不多的

以下内容只是凭记忆,不一定准确,楼主需要自己验证一下
--------------------
就直接用LoadLibrary就可以了,另外在CB里面有个def文件(好像是),里面有导出函数列表,在那里编辑就可以是正常的函数名了,好像还有个序号
---------------
 
GOOGLE一下,PE Explorer是一个PE工具,可以查看各种属性,也支持反汇编.加_好像是C的修饰.而在VC中我尝试了一下.extern "C&quot
void __declspec(dllexport) Say(char *WhaStToSay);导出的没有这个_.
至于你所说地异常,多半是调用方式.一般推荐使用__stdcall.注意两边都加上即可.是否是这个原因,你可以通过调试得到入口参数,看传递的是否和得到的一致,不一致肯定是调用方式了.
 
多人接受答案了。
 
后退
顶部