免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 8723 | 回复: 5
打印 上一主题 下一主题

delphi 调用VC写的DLL库怎么老是报内存错? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-08-06 23:23 |只看该作者 |倒序浏览
俺用VC写了一个动态链接库,为了测试,功能很简单,就是由Delphi传入两个整数,调用 DLL中的函数,返回两个整数的和。

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

论坛徽章:
0
2 [报告]
发表于 2005-08-07 00:10 |只看该作者

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程序中使用它.

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

论坛徽章:
0
3 [报告]
发表于 2005-08-07 09:17 |只看该作者

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

原帖由 "renstone921" 发表:
两种办法,一种是写DLL函数时,函数必须是有extern "C" __declspec(dllexport) .... __stdcall 定义.
也就是使用C语言的命名方式,__stdcall调用约定,如果你正确照做,应当不回有什么问题的.
也就是说,你的头文件的函?.........

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

不知道为什么??

论坛徽章:
0
4 [报告]
发表于 2005-08-07 14:10 |只看该作者

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

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

论坛徽章:
0
5 [报告]
发表于 2005-08-07 14:38 |只看该作者

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

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

论坛徽章:
0
6 [报告]
发表于 2008-12-05 15:13 |只看该作者
我的也是,我前两天还以为是我写错了,莫名其妙的内存跳转,一个参数使用前log一下是正确的,函数调用后log一下就跑了
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP