显式连接DLL的问题

tcszivy 2007-04-18 03:30:32
我写了一段小程序,里面有一个addxy的函数,用于计算x,y的和。我把这段程序生成了一个add.dll
之后又写了一段代码,用显式的方法调用这个DLL文件,不过用显式的方法调用时一直没成功,hDll = LoadLibrary(LPCWSTR("add.dll"))的返回值一直是0,调用getlasterror得到126----找不到指定模块!DLL文件的位置没有问题,我试过多次了,也写过绝对路径。而且我换成调用系统的Kernel32.dll文件也是返回0,麻烦各位大虾帮我看一下是什么原因,小弟感激不尽!!

刚注册的,还没有积分,望见谅!

//以下是生成DLL程序的主要代码
// add.cpp : 定义 DLL 应用程序的入口点。
//

#include "stdafx.h"


#include <windows.h>
#include <stdio.h>
#include <stdlib.h>


//#if BUILDING_DLL
# define DLLIMPORT __declspec (dllexport)
//#else /* Not BUILDING_DLL */
//# define DLLIMPORT __declspec (dllimport)
//#endif /* Not BUILDING_DLL */

/*定义了一个 dll 函数 addxy,返回2个数的和*/
extern "C" DLLIMPORT int addxy ( int x, int y)//---此处要加extern "C"吗
{
return (x+y);
}


BOOL APIENTRY DllMain (HINSTANCE hInst /* Library instance handle. */ ,
DWORD reason /* Reason this function is being called. */ ,
LPVOID reserved /* Not used. */ )
{
switch (reason)
{
case DLL_PROCESS_ATTACH: /*dll 进程加载的时候执行的事情*/
break;

case DLL_PROCESS_DETACH: /*dll 进程卸载的时候执行的事情*/
break;

case DLL_THREAD_ATTACH: /*dll 线程加载的时候执行的事情*/
break;

case DLL_THREAD_DETACH: /*dll 线程卸载的时候执行的事情*/
break;
}

/* Returns TRUE on success, FALSE on failure */
return TRUE;
}


//以下是调用DLL的程序代码
#include "stdafx.h"

#include <stdio.h>
#include <windows.h>
#include <assert.h>

extern "C" //-----此处要加吗


typedef int(*lpAddFun)(int, int); //宏定义函数指针类型

int main(int argc, char *argv[])
{
HINSTANCE hDll; //DLL句柄
lpAddFun addFun; //函数指针
int result;


SetLastError(0);
hDll = LoadLibrary(LPCWSTR("add.dll")); /*加载 testdll.dll*/
//hDll = ::LoadLibrary((LPCTSTR)"Kernel32.dll");
int err = GetLastError();
if (hDll != NULL)
{
addFun = (lpAddFun)GetProcAddress(hDll, "addxy");
if (addFun != NULL)
{
result = addFun(654, 212); /* 654 + 212*/
}
FreeLibrary(hDll);
}
return 0;
}

以下是隐式调用部分,在环境中设置了add.lib
//__declspec(dllimport) int addxy(int,int);
//
//int main(int argc, char *argv[])
//{
// int z = addxy(3,5);
//}
...全文
201 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
tcszivy 2007-04-18
  • 打赏
  • 举报
回复
此处要加extern "C"吗
--
目的是以c的方式来组织变量名

谢谢,#pragma comment(lib, "add.lib")我没加,不过我在环境中加了
tcszivy 2007-04-18
  • 打赏
  • 举报
回复
谢谢楼上几位
tcszivy 2007-04-18
  • 打赏
  • 举报
回复
那个add.dll是我自己写的,没有什么依赖,代码就在上面,你可以看一下。另外,我把add.dll换成C:\\windows\\system32\\Kernel32.dll调试也是同样的结果。

对于LPCWSTR,我开始没用,不过报错,不知道是不是因为我用的是VS。NET的原因
lidongri 2007-04-18
  • 打赏
  • 举报
回复
此处要加extern "C"吗
--
目的是以c的方式来组织变量名



以下是隐式调用部分,在环境中设置了add.lib
//__declspec(dllimport) int addxy(int,int);
//
//int main(int argc, char *argv[])
//{
// int z = addxy(3,5);
//}

---
加上#pragma comment(lib, "add.lib")
jenycheng 2007-04-18
  • 打赏
  • 举报
回复
另外
LoadLibrary(LPCWSTR("add.dll"));

如果你调用的不是W版本的Api 就不要用 LPCWSTR 这个宏
否则参数传进去就错了
jenycheng 2007-04-18
  • 打赏
  • 举报
回复
你的add.dll 里面是不是又加载了其他的库
而这个库不在指定的路径下
用depends看下你的add.dll 库
看是不是缺什么东西

64,654

社区成员

发帖
与我相关
我的任务
社区描述
C++ 语言相关问题讨论,技术干货分享,前沿动态等
c++ 技术论坛(原bbs)
社区管理员
  • C++ 语言社区
  • encoderlee
  • paschen
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
  1. 请不要发布与C++技术无关的贴子
  2. 请不要发布与技术无关的招聘、广告的帖子
  3. 请尽可能的描述清楚你的问题,如果涉及到代码请尽可能的格式化一下

试试用AI创作助手写篇文章吧