我对VC没什么了解,现在的程序要调用VC编写的一个dll文件。
我用VC调用这个dll文件的话,是没有问题的,可以正常的运行,
但是我用delphi调用的话,死活不行。
这个dll中的函数用
extern "C" _declspec(dllexport)输出的,
按照c中默认为cdecl,所以我在delphi中也是按照cdecl方式调用。开始以为是传参出现了问题,因为VC调用是没有问题的,所以我用VC在这个dll文件的基础上又重新做了个dll文件,没有参数传送。但是用delphi调用结果是一样的。有哪位大虾知道是怎么回事?这个dll文件是别人做好的,再改动的可能性不大,现在是使用VC可以正常使用,有什么方法让delphi也可以使用呢?
我用VC调用这个dll文件的话,是没有问题的,可以正常的运行,
但是我用delphi调用的话,死活不行。
这个dll中的函数用
extern "C" _declspec(dllexport)输出的,
按照c中默认为cdecl,所以我在delphi中也是按照cdecl方式调用。开始以为是传参出现了问题,因为VC调用是没有问题的,所以我用VC在这个dll文件的基础上又重新做了个dll文件,没有参数传送。但是用delphi调用结果是一样的。有哪位大虾知道是怎么回事?这个dll文件是别人做好的,再改动的可能性不大,现在是使用VC可以正常使用,有什么方法让delphi也可以使用呢?
解决方案 »
- 请高手把这句翻译成C#
- 我想在FORM显示出来后,自动运行窗口上的一个BUTTON按钮,该在哪个事件里写这段代码?
- 各位小弟有问题请教,希望帮忙呀
- help
- 有关数据转换的问题,恳请高手回答!
- 小弟希望个位高手能帮助一下。
- 【求助】泡泡游戏双开工具
- 紧急寻求Indy9的援助!!!!!!!!
- 如何实现在服务器端对两个客户端实时发送的数据进行比较(使用serversocket和clientsocket)
- 李维Ado第三章(关于ADO和WebBroker)的例子的问题?
- 程序員如果不盡量的去寫規范的代碼, 簡直就是一種罪孽。應該要踢出程序員的隊伍!!!!!!!!!!
- 关于CheckListBox极极极简单的问题
用 stdcall
function Csdn(CsdnStr:PChar):PChar;stdcall;external 'CSDN.dll';你可以把导出函数帖出来,我猜可能是你的类型没有搞对....
我都试过了,再说原dll是不能改动的,我不可能都对应成stdcall。to ksaiy(真爱不是取代,而是心中永恒的存在)
我现在不方便贴原函数,不过我说了,VC中调用是可以的,所以我已经在这个dll的基础上又打包了一个dll,我在VC的代码中都把参数填充好了(基本上就是把VC下调用成功的APP中的代码拷贝过来的),因为涉及到头文件声名的问题,所以我经常这样做。按照道理不管原dll文件是不是标准通用的dll,只要我在它的基础上重新按照标准把函数输出,delphi都是应该可以调用的呀。
我的delphi程序调用了很多VC编写的dll,从来都没出现过这样的问题,这个太奇怪了。
而且参数的类型也不复杂,就是有char *,PBYTE,unsigned char *,int,int *,不知道是不是内存管理不同造成的。
char *,PBYTE,unsigned char *,int,int *,这些参数应该是指针的问题,才说是“除数不能为零”的意思。
它仅表示函数在导出表中名称是C方式而非C++方式。
1 表示为导出函数
2 表示导出的函数为C方式 如果是C++方式就是 ?aaa@...之类的 这样外边就链接不到
所以用C方式的话 编译器就不会改变其函数在内部的名称...只要参数类型正确,应该没有问题的。cdecl方式调用VC的DLL是没有问题的,我用一直用这种方式来调用VC的DLL.其中注意一下结构体和指针的传送问题!
// 哦 是么 CDECL STDCALL你会汇编一下代码就好了 包括最开始的堆栈压入 以及堆栈恢复。。的方式 。char *,PBYTE,unsigned char *,int,int *,这些参数应该是指针的问题,才说是“除数不能为零”的意思。
// 除数不能为0?? 可能你传入了空指针 然后取空指针的值...
char* -> PChar;
unsigned char* -> PBYTE;
int* -> PInteger; // 或者 var Integer;
可能是内存管理的问题,因为原dll文件是用来处理图片的,工作量很大。
那偶也不知道虾米问题了....
但是就是不能用Delphi调用。
我想知道除了参数以外,还有什么东西使得VC编写的dll文件死活不能让Delphi调用!!!
首先,cdecl方式输出的VC的DLL在Delphi中进行stdcall调用肯定是行不通的。参数压栈方式不同,造成取参时参数错位,这可能是楼主遇到问题的主要原因。
解决方式楼主可以考虑:
1.想办法以stdcall方式重新编译一下VC的DLL,这必竟是最方便省心的办法。而且要养成好习惯,想在非VC语言中使用的DLL,都要做成stdcall形式。
2.在Delphi声明中把参数顺序倒过来,并且不要带stdcall关键字。成不成我没试过。希望对楼主有帮助。
这个东西我可以给点建议:
首先,cdecl方式输出的VC的DLL在Delphi中进行stdcall调用肯定是行不通的。参数压栈方式不同,造成取参时参数错位,这可能是楼主遇到问题的主要原因。
----------------------
这个不是问题,因为我不是用stdcall调用的,这点常识我还是有的。
解决方式楼主可以考虑:
1.想办法以stdcall方式重新编译一下VC的DLL,这必竟是最方便省心的办法。而且要养成好习惯,想在非VC语言中使用的DLL,都要做成stdcall形式。
------------------------------------------------
这个没有办法,因为dll不是我写的,对方提供给我时就是用的cdecl方式。
2.在Delphi声明中把参数顺序倒过来,并且不要带stdcall关键字。成不成我没试过。希望对楼主有帮助。
----------------------------------------------------能试的方法我都试了,基本上得出了结论,和参数类型,以及调用方式无关,
猜想是内存管理不同造成的。
使用 VC 重新包装 Dll 为 stdcall 方式,同时使用 def 文件导出 新 的 Dll
再使用 Delphi 调用