新人请教用LoadLibrary和GetProcAddress动态加载DLL

lanxinglinxi 2013-03-09 02:31:44
下面这一段是动态加载dll的部分。

HMODULE hDll=LoadLibrary("D:\\Code\\1001\\1001\\PrivateDLL.dll");
if (hDll!=NULL)
{
typedef int (* _BinarySearch)(int *a,int length,int number);
_BinarySearch BinarySearch=NULL;
BinarySearch=(_BinarySearch)GetProcAddress(hDll,"BinarySearch");

if (!BinarySearch)
{
printf("加载DLL函数失败!\n");
}
else
{
while(!feof(file))
{
fscanf(file,"%d",&temp);
if (BinarySearch(num,num_count,temp)==-1)
{
printf("No\n");
}
else
{
printf("Yes\n");
}
}
}
}
else
{
printf("打开DLL文件失败\n");
}

FreeLibrary(hDll);

fclose(file);


下面是PrivateDLL.h文件的部分内容。我写的两个函数是BinarySearch,SequentialSearch。


#ifdef PRIVATEDLL_EXPORTS
#define PRIVATEDLL_API __declspec(dllexport)
#else
#define PRIVATEDLL_API __declspec(dllimport)
#endif

extern PRIVATEDLL_API int nPrivateDLL;

PRIVATEDLL_API int fnPrivateDLL(void);
PRIVATEDLL_API int BinarySearch(int *a,int length,int number);
PRIVATEDLL_API int SequentialSearch(int *a,int length,int number);


编译通过,调试运行时会走到“加载DLL函数失败”这里。
BinarySearch 值:0x00000000 类型:int (int *, int, int)*

请问各位大侠,该如何解决?
...全文
283 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
苹果皮 2013-03-09
  • 打赏
  • 举报
回复
http://blog.csdn.net/conanlrj/article/details/5797549 这个链接你看一下
lanxinglinxi 2013-03-09
  • 打赏
  • 举报
回复
引用 6 楼 a443475601 的回复:
引用 4 楼 lanxinglinxi 的回复:引用 2 楼 a443475601 的回复:引用 1 楼 a443475601 的回复:你用Depends.exe 看看那个dll的导出函数 有木有BinarySearch 或者 函数名是不是跟BinarySearch一样 你那个dll 编译的时候 #define PRIVATEDLL_EXPORTS了吗? ……
我搞错了,可以哦,忘记了把重新编译的dll和lib文件替换了。 请问这是什么原因呢?解释一下原理?
lanxinglinxi 2013-03-09
  • 打赏
  • 举报
回复
引用 6 楼 a443475601 的回复:
引用 4 楼 lanxinglinxi 的回复:引用 2 楼 a443475601 的回复:引用 1 楼 a443475601 的回复:你用Depends.exe 看看那个dll的导出函数 有木有BinarySearch 或者 函数名是不是跟BinarySearch一样 你那个dll 编译的时候 #define PRIVATEDLL_EXPORTS了吗? ……
谢谢热心帮忙解答,不过试了后,没用。。。
苹果皮 2013-03-09
  • 打赏
  • 举报
回复
引用 4 楼 lanxinglinxi 的回复:
引用 2 楼 a443475601 的回复:引用 1 楼 a443475601 的回复:你用Depends.exe 看看那个dll的导出函数 有木有BinarySearch 或者 函数名是不是跟BinarySearch一样 你那个dll 编译的时候 #define PRIVATEDLL_EXPORTS了吗? 我用depends.exe打开后看到的结果如……
额 弄个.def文件吧,把导出函数名写进去, 就不用 PRIVATEDLL_API int BinarySearch(int *a,int length,int number);这个了。 你百度一下 这个很容易的,应该不会出现你的这个问题了。
lanxinglinxi 2013-03-09
  • 打赏
  • 举报
回复
用代理上网的延迟就是大,提示回复失败,再发一次,结果就重复了。。。
lanxinglinxi 2013-03-09
  • 打赏
  • 举报
回复
引用 2 楼 a443475601 的回复:
引用 1 楼 a443475601 的回复:你用Depends.exe 看看那个dll的导出函数 有木有BinarySearch
或者 函数名是不是跟BinarySearch一样


你那个dll 编译的时候
#define PRIVATEDLL_EXPORTS了吗?


我用depends.exe打开后看到的结果如下,我不是很懂dll编写,不过看下面的应该是有BinarySearch这个函数的。


至于说是否#define PRIVATEDLL_EXPORTS,这个。。。技术不到家,我贴出完整dll的代码,请你帮忙看看吧

下面是PrivateDLL.h

// 下列 ifdef 块是创建使从 DLL 导出更简单的
// 宏的标准方法。此 DLL 中的所有文件都是用命令行上定义的 PRIVATEDLL_EXPORTS
// 符号编译的。在使用此 DLL 的
// 任何其他项目上不应定义此符号。这样,源文件中包含此文件的任何其他项目都会将
// PRIVATEDLL_API 函数视为是从 DLL 导入的,而此 DLL 则将用此宏定义的
// 符号视为是被导出的。
#ifdef PRIVATEDLL_EXPORTS
#define PRIVATEDLL_API __declspec(dllexport)
#else
#define PRIVATEDLL_API __declspec(dllimport)
#endif

// 此类是从 PrivateDLL.dll 导出的
class PRIVATEDLL_API CPrivateDLL {
public:
CPrivateDLL(void);
// TODO: 在此添加您的方法。
};

extern PRIVATEDLL_API int nPrivateDLL;

PRIVATEDLL_API int fnPrivateDLL(void);
PRIVATEDLL_API int BinarySearch(int *a,int length,int number);
PRIVATEDLL_API int SequentialSearch(int *a,int length,int number);


下面是PrivateDLL.cpp

// PrivateDLL.cpp : 定义 DLL 应用程序的导出函数。
//

#include "stdafx.h"
#include "PrivateDLL.h"


// 这是导出变量的一个示例
PRIVATEDLL_API int nPrivateDLL=0;

// 这是导出函数的一个示例。
PRIVATEDLL_API int fnPrivateDLL(void)
{
return 42;
}

//---------------------------------------------------------------------------------------------------//
//从递增有序数组a中查找number,查找成功返回数字的位置,不成功返回-1;
PRIVATEDLL_API int BinarySearch(int *a,int length,int number)//由于数组作参数传递时,会退化为指针,故此函数的定义加上一个参数,增加适应性;
{
int low=0,high=length-1;
while (low<=high)
{
int mid=(low+high)/2;
if (a[mid]==number)
{
return mid;
}
else if (a[mid]>number)
{
high=mid-1;
}
else
{
low=mid+1;
}
}
return -1;
}

PRIVATEDLL_API int SequentialSearch(int *a,int length,int number)
{
for (int i=0;i<length;i++)
{
if (a[i]==number)
{
break;
return i;
}
}
return -1;
}



// 这是已导出类的构造函数。
// 有关类定义的信息,请参阅 PrivateDLL.h
CPrivateDLL::CPrivateDLL()
{
return;
}

lanxinglinxi 2013-03-09
  • 打赏
  • 举报
回复
引用 2 楼 a443475601 的回复:
引用 1 楼 a443475601 的回复:你用Depends.exe 看看那个dll的导出函数 有木有BinarySearch
或者 函数名是不是跟BinarySearch一样


你那个dll 编译的时候
#define PRIVATEDLL_EXPORTS了吗?


我用depends.exe打开后看到的结果如下,我不是很懂dll编写,不过看下面的应该是有BinarySearch这个函数的。


至于说是否#define PRIVATEDLL_EXPORTS,这个。。。技术不到家,我贴出完整dll的代码,请你帮忙看看吧

下面是PrivateDLL.h

// 下列 ifdef 块是创建使从 DLL 导出更简单的
// 宏的标准方法。此 DLL 中的所有文件都是用命令行上定义的 PRIVATEDLL_EXPORTS
// 符号编译的。在使用此 DLL 的
// 任何其他项目上不应定义此符号。这样,源文件中包含此文件的任何其他项目都会将
// PRIVATEDLL_API 函数视为是从 DLL 导入的,而此 DLL 则将用此宏定义的
// 符号视为是被导出的。
#ifdef PRIVATEDLL_EXPORTS
#define PRIVATEDLL_API __declspec(dllexport)
#else
#define PRIVATEDLL_API __declspec(dllimport)
#endif

// 此类是从 PrivateDLL.dll 导出的
class PRIVATEDLL_API CPrivateDLL {
public:
CPrivateDLL(void);
// TODO: 在此添加您的方法。
};

extern PRIVATEDLL_API int nPrivateDLL;

PRIVATEDLL_API int fnPrivateDLL(void);
PRIVATEDLL_API int BinarySearch(int *a,int length,int number);
PRIVATEDLL_API int SequentialSearch(int *a,int length,int number);


下面是PrivateDLL.cpp

// PrivateDLL.cpp : 定义 DLL 应用程序的导出函数。
//

#include "stdafx.h"
#include "PrivateDLL.h"


// 这是导出变量的一个示例
PRIVATEDLL_API int nPrivateDLL=0;

// 这是导出函数的一个示例。
PRIVATEDLL_API int fnPrivateDLL(void)
{
return 42;
}

//---------------------------------------------------------------------------------------------------//
//从递增有序数组a中查找number,查找成功返回数字的位置,不成功返回-1;
PRIVATEDLL_API int BinarySearch(int *a,int length,int number)//由于数组作参数传递时,会退化为指针,故此函数的定义加上一个参数,增加适应性;
{
int low=0,high=length-1;
while (low<=high)
{
int mid=(low+high)/2;
if (a[mid]==number)
{
return mid;
}
else if (a[mid]>number)
{
high=mid-1;
}
else
{
low=mid+1;
}
}
return -1;
}

PRIVATEDLL_API int SequentialSearch(int *a,int length,int number)
{
for (int i=0;i<length;i++)
{
if (a[i]==number)
{
break;
return i;
}
}
return -1;
}



// 这是已导出类的构造函数。
// 有关类定义的信息,请参阅 PrivateDLL.h
CPrivateDLL::CPrivateDLL()
{
return;
}

苹果皮 2013-03-09
  • 打赏
  • 举报
回复
引用 1 楼 a443475601 的回复:
你用Depends.exe 看看那个dll的导出函数 有木有BinarySearch 或者 函数名是不是跟BinarySearch一样
你那个dll 编译的时候 #define PRIVATEDLL_EXPORTS了吗?
苹果皮 2013-03-09
  • 打赏
  • 举报
回复
你用Depends.exe 看看那个dll的导出函数 有木有BinarySearch 或者 函数名是不是跟BinarySearch一样

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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