打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
新人请教用LoadLibrary和GetProcAddress动态加载DLL
下面这一段是动态加载dll的部分。
C/C++ code?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
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。

C/C++ code?
1
2
3
4
5
6
7
8
9
10
11
#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)*

请问各位大侠,该如何解决?

dll c 动态加载
分享到: 更多 0
回复次数:9
a443475601
苹果皮
等级:
#1 得分:0 回复于: 2013-03-09 15:26:53
你用Depends.exe 看看那个dll的导出函数 有木有BinarySearch
或者 函数名是不是跟BinarySearch一样
a443475601
苹果皮
等级:
#2 得分:0 回复于: 2013-03-09 15:27:35
引用 1 楼 a443475601 的回复:
你用Depends.exe 看看那个dll的导出函数 有木有BinarySearch
或者 函数名是不是跟BinarySearch一样


你那个dll 编译的时候
#define PRIVATEDLL_EXPORTS了吗?
lanxinglinxi
lanxinglinxi
等级:
#3 得分:0 回复于: 2013-03-09 16:01:32
引用 2 楼 a443475601 的回复:
引用 1 楼 a443475601 的回复:你用Depends.exe 看看那个dll的导出函数 有木有BinarySearch
或者 函数名是不是跟BinarySearch一样


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

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


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


下面是PrivateDLL.h
C/C++ code?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// 下列 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
C/C++ code?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
// 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
lanxinglinxi
等级:
#4 得分:0 回复于: 2013-03-09 16:01:42
引用 2 楼 a443475601 的回复:
引用 1 楼 a443475601 的回复:你用Depends.exe 看看那个dll的导出函数 有木有BinarySearch
或者 函数名是不是跟BinarySearch一样


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

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


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


下面是PrivateDLL.h
C/C++ code?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
// 下列 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
C/C++ code?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
// 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
lanxinglinxi
等级:
#5 得分:0 回复于: 2013-03-09 16:03:12
用代理上网的延迟就是大,提示回复失败,再发一次,结果就重复了。。。
a443475601
苹果皮
等级:
#6 得分:0 回复于: 2013-03-09 20:37:33
引用 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
lanxinglinxi
等级:
#7 得分:0 回复于: 2013-03-09 21:34:36
引用 6 楼 a443475601 的回复:
引用 4 楼 lanxinglinxi 的回复:引用 2 楼 a443475601 的回复:引用 1 楼 a443475601 的回复:你用Depends.exe 看看那个dll的导出函数 有木有BinarySearch
或者 函数名是不是跟BinarySearch一样


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

谢谢热心帮忙解答,不过试了后,没用。。。
lanxinglinxi
lanxinglinxi
等级:
#8 得分:0 回复于: 2013-03-09 21:39:17
引用 6 楼 a443475601 的回复:
引用 4 楼 lanxinglinxi 的回复:引用 2 楼 a443475601 的回复:引用 1 楼 a443475601 的回复:你用Depends.exe 看看那个dll的导出函数 有木有BinarySearch
或者 函数名是不是跟BinarySearch一样


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

我搞错了,可以哦,忘记了把重新编译的dll和lib文件替换了。

请问这是什么原因呢?解释一下原理?
a443475601
苹果皮
等级:
#9 得分:20 回复于: 2013-03-09 21:46:41
http://blog.csdn.net/conanlrj/article/details/5797549

这个链接你看一下
本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
如何在程序中用显式加载的方式使用DLL中的导出类(1)
在写dll时关于declspec(dllexport)和declspec(dllimport)
c++静态库和动态库的使用
c语言中的malloc()包含在哪个库函数中
WINDOWS API 程序设计(第一章:开始) | 博客网
一步一步教你用VC和VB调用C DLL
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服