编译dll后,不能正常调用
我想要编译个一个dll能够让其他应用程序调用,比如delphi编的程序能调用这个动态库
我在vc中建立一个 Win32 Dynamic-Link Library的程序,
然后建立了两个文件:lib.h和lib.cpp文件
lib.h中的内容
#ifndef LIB_H
#define LIB_H
extern "C" int __declspec(dllexport) __stdcall add(int x, int y); //__stdcall
#endif
lib.cpp中的内容
#include "lib.h"
int __stdcall add(int x, int y)
{
return x + y;
}
编译完全可以通过,并且也生成了预期的dllTest.dll,但是这个动态库放在别的地方确不能正常调用,这个是为什么,我在vb中或者用vc调用,总是提示找不到 add函数的入口地址。请前辈指点。
问题点数:20、回复次数:18Top
1 楼vcmute(BCare4 H1Rest Good9!)回复于 2006-03-05 22:26:35 得分 0
用depends看看有没有入口地址Top
2 楼fangyc()回复于 2006-03-05 22:57:07 得分 0
我通过 depends 看了,
Ordinal^ = 1(0x00001) ,Hint = 0(0x0000) ,Function = _add@8 ,Entry Point = 0x00001005
真是奇怪了,为什么我的函数名会成了_add@8了,而不是 add?
我想应该和__stdcall 这个有关,那么我在vb中调用,定义:
Declare Function add Lib "dllTest.dll" (a As Integer, b As Integer) As Integer
就是不能用,不知道为什么?Top
3 楼fangyc()回复于 2006-03-06 09:12:17 得分 0
顶!Top
4 楼xx_jj()回复于 2006-03-06 09:26:41 得分 0
静态连接还是动态连接Top
5 楼fangyc()回复于 2006-03-06 09:43:34 得分 0
我是静态连接的Top
6 楼bohlee(我心澎湃)回复于 2006-03-06 09:50:43 得分 0
三种可能:
库写的有错误
调用部分写的有错误
都有错误
调用部分写出来Top
7 楼bohlee(我心澎湃)回复于 2006-03-06 09:51:04 得分 0
老夫子帮你看看
Top
8 楼fangyc()回复于 2006-03-06 10:04:58 得分 0
好的,多谢!
我再vb中声明了这个动态库的调用如下:
Declare Function add Lib "dllTest.dll" (a As Integer, b As Integer) As Integer
然后放了一个按钮调用:
Private Sub Command1_Click()
MsgBox add(22, 43)
End Sub
结果我编译成为可执行文件以后,单击按钮,出现错误提示:
运行时错误'453':
不能找到入口点add在dllTest.dll
请 bohlee(达达)帮忙看看,处理好了,我可以多给你加分的!Top
9 楼chehw(chehw)回复于 2006-03-06 10:17:54 得分 0
需要建一个.def文件, 加入你所有的导出函数.Top
10 楼fangyc()回复于 2006-03-06 10:22:55 得分 0
如果不建立 .def 直接在 .h中定义也可以导出的。
Top
11 楼chehw(chehw)回复于 2006-03-06 10:48:10 得分 10
如果你能够在工程中加入dll的lib文件,是可以不建立def文件;
但若使用LoadLibrary之类的方法调用, 应有def文件(我曾在vc6.0 sdk下测试过多次)。Top
12 楼fangyc()回复于 2006-03-06 10:52:04 得分 0
好的,我现在用了def文件了,我在Vb中是可以调用了,不过怎么会加法计算出来的值是错误的。
我在vb中,调用 add(22,33),按理说返回值应该是55,但是返回值却成了一个负数 -5900,这个真是奇怪,请指定一下。Top
13 楼sevencat(七猫)回复于 2006-03-06 10:58:36 得分 0
__stdcall去掉试试。Top
14 楼fangyc()回复于 2006-03-06 11:17:43 得分 0
我是把 __stdcall去掉了之后在试的,如果加了__stdcall的话,调用的时候连这个函数的入口地址都找不到的。但是去掉了之后,调用起来就是会计算错误的,返回了负数。Top
15 楼fangyc()回复于 2006-03-06 11:19:45 得分 0
真是寂寞啊,请高人指点Top
16 楼sinkileu(小心)回复于 2006-03-06 11:31:54 得分 5
导入时也加__stdcall试试:
#pragma comment(lib, "dllTest.lib")
extern "C" int __declspec(dllimport) __stdcall add(int, int);Top
17 楼chehw(chehw)回复于 2006-03-06 11:35:06 得分 5
你在vb中声明与VC中的不一致.
VC中的int是32位, VB中的integer是16位
VB中应声明如下:
Declare Function add Lib "dllTest.dll" (a As long, b As long) As long
Top
18 楼fangyc()回复于 2006-03-06 12:40:55 得分 0
好了总于解决了,原来在vb中调用的时候
需要这样定义:
Declare Function add Lib "dllTest.dll" (ByVal a As Integer, ByVal b As Integer) As Integer
就是多了一个 ByVal 关键字问题就解决了,看样子动态库还是对的,就是在调用的时候出问题了。多谢各位进来讨论,我马上加分。
Top




