蓝森林首页 | 返回主页 | 本站地图 | 站内搜索 | 联系信箱 |
 您目前的位置:首页 > 自由软件 > 技术交流 > 应用编程


    

蓝森林 http://www.lslnet.com 2006年6月6日 10:18


delphi 调用VC写的DLL库怎么老是报内存错?

俺用VC写了一个动态链接库,为了测试,功能很简单,就是由Delphi传入两个整数,调用 DLL中的函数,返回两个整数的和。

很简单的一个程序吧,可是运行后出现内存read错。
真是郁闷。

delphi 调用VC写的DLL库怎么老是报内存错?

两种办法,一种是写DLL函数时,函数必须是有extern "C" __declspec(dllexport) .... __stdcall 定义.
也就是使用C语言的命名方式,__stdcall调用约定,如果你正确照做,应当不回有什么问题的.
也就是说,你的头文件的函数声明应当是
extern "C" __declspec(dllexport) int __stdcall sum(int x, int y)这样的;
如果你没有加__stdcall 的化,C/C++语言默认使用的是__cdecl约定;
不加extern "C"的话,C++使用的是自己的名字分裂技术,pascal不一定能接受.

__declspec(dllexport)则是指定这个函数是有DLL导出的.

另一种方法,使用COM方式,定义一个接口ISum,ISum继承自IUnknown,
定义一个实现类CSum实现了IUnknow的QueryInterface AddRef ReleaseRef 以及ISum接口的Sum方法,还需要实现继承自IClassFactory接口的CClassFactory类,然后实现几个DLL支持函数如DllRegisterServer和DllUnregisterServer函数.或者如果懒得写这几个函数的话,直接使用ATL创建一个COM对象,编译连接后运行regsvr32注册组件.

然后有Delphi导入COM组建产生一个TLB的接口文件,并在你的Delphi程序中使用它.

如果你遵循以上两种方法的话,应当不回在出什么问题了.

delphi 调用VC写的DLL库怎么老是报内存错?

-->
=====================================
我是按照第一种方法做的。
运行的时候出现:
access violation at address 1021674c in modual "MSVCRTD.dll".
read of address 00000001.process stoped

不知道为什么??

delphi 调用VC写的DLL库怎么老是报内存错?

由于PASCAL同C++之间的区别较大,比如调用规则,以及数据类型,最简单的就是字符串类型,两者的实现都不一样.所以在做通用的C的DLL的时侯一定要注意下面两点.
1.函数的调用规则一定要用stdcall也就是windows api的调用规则,编译完成后可以使用工具depends观察所生成的dll函数,如果同定义的函数名一样,说明在这一点上已经通过
2.函数的类型和参数类型一定要用两者统一使用且无歧义的类型,比如int在32位平台上,你就用DWORD来传.更详细的请参照网上资料

delphi 调用VC写的DLL库怎么老是报内存错?

把你PASCAL的函数头贴出来看一下.



Copyright © 1999-2000 LSLNET.COM. All rights reserved. 蓝森林网站 版权所有。 E-mail : webmaster@lslnet.com