情况描述:
一个用VC写的程序,调用了一个DLL文件EssApin.dll,编译成A.exe,可以成功执行。
将这个A.exe改写编译为B.dll,用另一个VC写的程序C.exe调用B.dll,也可以成功执行。
但是,用Delphi写一个程序调用B.dll,却出现错误,给出的错误信息是EssApin.dll模块中出现"Access Violation"。调用B.dll使用 过external关键字、LoadLibrary函数这2种方法,但是错误依旧。
疑点:
1.为什么B.dll用VC写的程序可以调用,而Delphi写的却不行。
2.为什么错误是出在EssApin.dll模块中,而不是B.dll模块中。
郁闷中,请高手指点迷津,不胜感激。
一个用VC写的程序,调用了一个DLL文件EssApin.dll,编译成A.exe,可以成功执行。
将这个A.exe改写编译为B.dll,用另一个VC写的程序C.exe调用B.dll,也可以成功执行。
但是,用Delphi写一个程序调用B.dll,却出现错误,给出的错误信息是EssApin.dll模块中出现"Access Violation"。调用B.dll使用 过external关键字、LoadLibrary函数这2种方法,但是错误依旧。
疑点:
1.为什么B.dll用VC写的程序可以调用,而Delphi写的却不行。
2.为什么错误是出在EssApin.dll模块中,而不是B.dll模块中。
郁闷中,请高手指点迷津,不胜感激。
解决方案 »
- 请各位前辈看看我这段DLL远程注入哪出了问题
- 多线程动态调用同一dll,每个线程用的是dll的副本么?
- 在WINDOWS2003下如何解决DCOM服务不能设为NT形态的问题
- 用Listview实现缩略图为什么总有问题(附程序源码)
- 新手问题
- 我现在用delphi7.0,有必要升级为delphi8.0吗?
- 利用dll 调用webservice,dll到了别的机器上用不起来------急急急急急急急急急急急急
- 谁能提供一个比较好的卷动盒控件?
- 同志们早,先到先问个问题:关于操作数据表中的数据的问题
- SQL语句在MSSQLSERVER中是能用的。 在ORACLE,SYSBASE,MYSQL,DB2,ACCESS中要怎样写呀?
- 学习DELPHI的一些想法。
- 为什么toolbar上的button不能显示icon??
__declspec(dllexport) long Ess_Login(char srvrName[],char userName[],char pswd[]);
以上五个函数均调用essapin.dll的Export函数,这个程序以C方式编译成dll002.dll。Delphi中函数声明:
function Ess_Login(const ServerName, UserName, PassWord: PChar): integer;stdcall;external 'dll002.dll';调用代码如下:
Ess_Login(PChar('127.0.0.1'),PChar('db2admin'),PChar('abcd1234'));
运行时出错不是在dll002.dll模块,而是在essapin.dll模块。再次强调,用VC调用dll002.dll没有出现错误。
我现在倾向于认为是Delphi5和essapin.dll不兼容。
对Vc,C++生成的Dll的调用,一般用cdel或stdcall
问一下:只是在调用的时候出现的问题吗?是关于窗体的调用吗?我问的前提是dll的调用没有什么问题?也许你的问题我遇到过
那几个EXPORT函数都是接受char[]类型的参数,用C程序调用时没什么问题,用delphi调用就不行了。我把dll改了一下,对每个参数都用strcpy考到函数的内部数组里,这样就再没出现过问题。
我想,归根到底是我写的B.dll要调用的那个EssApin.dll对字符串的处理不好才造成了这些问题。