我用delphi调用vc6.0编的dll碰到一堆问题,一条条地问:
1:为什么程序退出时总会出“invalid pointer operation”及“runtimeerror 217 at 00413708”的错?
有关代码:
调用声明:
function show1Dlltry():integer ;cdecl;external 'dlltry1.dll'
Exports from dlltry.dll
5 exported name(s), 5 export addresse(s). Ordinal base is 1.
Sorted by Name:
RVA Ord. Hint Name
-------- ---- ---- ----
00001005 1 0000 ??0CDlltry@@QAE@XZ
00001014 2 0001 ??4CDlltry@@QAEAAV0@ABV0@@Z
00001019 3 0002 ?fnDlltry@@YAHXZ
0002E3E0 4 0003 nDlltry
0000100F 5 0004 show1Dlltry
1:为什么程序退出时总会出“invalid pointer operation”及“runtimeerror 217 at 00413708”的错?
有关代码:
调用声明:
function show1Dlltry():integer ;cdecl;external 'dlltry1.dll'
Exports from dlltry.dll
5 exported name(s), 5 export addresse(s). Ordinal base is 1.
Sorted by Name:
RVA Ord. Hint Name
-------- ---- ---- ----
00001005 1 0000 ??0CDlltry@@QAE@XZ
00001014 2 0001 ??4CDlltry@@QAEAAV0@ABV0@@Z
00001019 3 0002 ?fnDlltry@@YAHXZ
0002E3E0 4 0003 nDlltry
0000100F 5 0004 show1Dlltry
解决方案 »
- 批量读写JPEG图片性能如何提高,困扰很久的问题了,恐怕无人能答啊!!!
- FastReport4.0安装后中文的问题。
- 关于静态调用dll的问题
- help,怎么实现网络拓扑图
- interbase我怎么找不到啊?在线等待!
- 连接及查询问题
- 50分求Format函数的所有用法。
- 请帮忙。怎么样在切换子窗体时根据子窗体内容动态改变父窗体文本框的内容?
- 新手问题(我只够给22分)但请详细地说
- 在DLL中使用FOEM的问题!
- 【急:Delphi打开出错“无法定位程序输入点@Sysutils@CheckWin32Version$qqrii于动态链接库rtl60.bpl】
- 求助!!我在用delphi6里面用QREXPRMEMO这个控件想实现报表中的自动换行显示,可是不能实现,请问高手怎么实现。。在线等您的答复。。。
#define DLLTRY_API __declspec(dllexport)
#else
#define DLLTRY_API __declspec(dllimport)
#endif
extern "C" DLLTRY_API int show1Dlltry(void);dlltry.cpp中是这样的:DLLTRY_API int show1Dlltry(void)
{MessageBox(NULL,"Hello world","Try",MB_OK);
return 0;
}
试过了,结果一样。
可以正确调用,但是程序退出时将非法操作。
谢谢你贴的文章。但是问题仍然存在……
按文章说法,这种delphi下调用vc++编的dll最好用动态调用。经尝试,还是在退出时出现同样的错误。
2. 不要试图一边申请内存,一边释放
通俗的说,就是谁(EXE 和 DLL)申请的内存谁释放
如果把vc里的函数声明从
extern "C" DLLTRY_API int show1Dlltry(void);
改为
extern DLLTRY_API int show1Dlltry(void);
那么用tdump看到的将是这样:Exports from dlltry.dll
5 exported name(s), 5 export addresse(s). Ordinal base is 1.
Sorted by Name:
RVA Ord. Hint Name
-------- ---- ---- ----
00001005 1 0000 ??0CDlltry@@QAE@XZ
0000100F 2 0001 ??4CDlltry@@QAEAAV0@ABV0@@Z
00001019 3 0002 ?fnDlltry@@YAHXZ
0002E3E0 4 0003 ?nDlltry@@3HA
00001014 5 0004 ?show1Dlltry@@YAHXZ然后在delphi里调用时用
function show1Dlltry: integer;external 'dlltry1.dll';这样的声明会出现无法定位的错误。
我只得改用function show1Dlltry: integer;external 'dlltry1.dll' index 5
或 function show1Dlltry: integer;external 'dlltry1.dll' name '?show1Dlltry@@YAHXZ'
的方式。那么有别的方法吗?
在Behard(我爱天安门)的文章中提到这是所谓的名字分解,但是不够详细,具体情况能详细一点地说说吗?
extern "C" long CALLBACK EXPORT func()形式Delphi端用stdcall
我推荐
function show1Dlltry: integer;external 'dlltry1.dll' index 5
速度较快
下面继续:
To :Behard(我爱天安门)
我对名字分解想多了解一些,诸如为什么要名字分解,什么情况下应该使用名字分解,分解和不分解对调用有什么影响,各有什么优缺点,是怎样名字分解的。以上问题均针对delphi调用VC编写的dll。
就目前看来,我的理解是似乎不分解的时候才可以简单地使用function show1Dlltry: integer;external 'dlltry1.dll'来静态调用dll中函数。分解后的名字奇奇怪怪的。
另外谢谢lazycat818(lazycat818)与dext(德克斯特)的热心。
{MessageBox(NULL,"Hello world","Try",MB_OK);
return 0;
}调用function show1Dlltry():integer ;stdcall;external 'dlltry1.dll'看看
应该没什么问题了
谢谢楼上这位,我现在已经会调用了,不过我后来的问题还是没人答……
醒目起见,再贴一遍:
关于“名字分解”的问题:为什么要名字分解,什么情况下应该使用名字分解,分解和不分解对调用有什么影响,各有什么优缺点,是怎样名字分解的。以上问题均针对delphi调用VC编写的dll。
就目前看来,我的理解是似乎不分解的时候才可以简单地使用function show1Dlltry: integer;external 'dlltry1.dll'来静态调用dll中函数。分解后的名字奇奇怪怪的。各位千万不要谦虚啊,多多指教^_^
http://community.csdn.net/Expert/topic/3086/3086143.xml?temp=.1206324名字分解,有时也称"修饰名字",是为C++中使用重载函数而创建的。在C++中可以有几个参数不同而名字相同的函数。一个最常见的是构造函数。
但是如果你下模块想链接到C模块时不允许出现名字分解的函数。
这样就是 extern “C”了