CSDN首页 空间 新闻 论坛 Blog 下载 读书 网摘 搜索 .NET Java 视频 接项目 求职 在线学习 买书 程序员 通知
IBM Rational 系统开发最佳实践工具包 WebSphere MQ 最佳实践 TOP 15
CSDN社区
搜索 收藏 打印 关闭
CSDN社区 >  VC/MFC >  基础类

编译dll后,不能正常调用

楼主fangyc()2006-03-05 22:23:02 在 VC/MFC / 基础类 提问

我想要编译个一个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

相关问题

  • VC.NET如何调用VC6.0编译的DLL?
  • C# 编译dll VB调用 可以吗
  • 怪问题求救: VB做的COM VC调用,解释模式正常, 编译成dll就出问题
  • 怎么把窗体编译成dll,怎么调用窗体dll?
  • 我在asp中调用了我写的com组件(dll),运行正常,可是当我从新编译时(运行一次后),老是说无法打开dll
  • 如何在vc++中调用delphi编译的DLL
  • 如何生成编译dll,并在前台调用
  • delphi5编译dll为什么不能在PB中调用出错
  • vb程序调用VC编译的DLL出错问题?
  • 调用ATL编写的DLL是编译出错

关键词

  • 编译
  • vb
  • 函数
  • 文件
  • 动态库
  • 连接
  • dll
  • vc
  • 调用
  • dlltest

得分解答快速导航

  • 帖主:fangyc
  • chehw
  • sinkileu
  • chehw

相关链接

  • Visual C++类图书
  • Visual C++类源码下载

广告也精彩

反馈

请通过下述方式给我们反馈
反馈
提问
网站简介|广告服务|VIP资费标准|银行汇款帐号|网站地图|帮助|联系方式|诚聘英才|English|问题报告
北京创新乐知广告有限公司 版权所有, 京 ICP 证 070598 号
世纪乐知(北京)网络技术有限公司 提供技术支持
Copyright © 2000-2008, CSDN.NET, All Rights Reserved
GongshangLogo