求好心人写个动态加载dll的代码。。。

时间:2023-01-31 09:26:31
我先给个框架:

// MyDll.h
void DLLTest();

class CTest
{
public:
void Test()
{
MessageBoxA(0, "dll的类成员函数", 0, MB_OK);
}
};

// MyDll.cpp
#include "MyDll.h"


void DLLTest()
{
MessageBoxA(0, "这是dll中的函数", 0, MB_OK);
}

BOOL APIENTRY DllMain(HANDLE hModule, DWORD ul_reason_for_call, LPVOID lpReserved)
{
  // .. 略
}

// exe
// Main.cpp
#include <windows.h>
#include "MyDll.h"

int main()
{
HINSTANCE hDll = LoadLibrary("dll\\MyDll.dll");
if (hDll == NULL) return 0;

CTest test;
test.Test();

DLLTest();

FreeLibrary(hDll);

return 0;
}


哪位好心人可以说一下,还需要做哪些工作啊?,运行起来总是提示找不到dll,main函数都没跑进去- -

21 个解决方案

#1


新建一个dll工程,导出符号就可以了

#2


引用 1 楼 ouyh12345 的回复:
新建一个dll工程,导出符号就可以了


如果不写导出文件呢?

#3



//DLL内容

extern "C" _declspec(dllimport)  int add(int a,int b);

int add(int a,int b)
{
    return a+b;
}


//调用方法 (调用程序和DLL.dll文件要放在同一个文件夹)
OnBtnAdd() //调用动态链接库中的Add函数
{
    HINSTANCE hInst;
    hInst=LoadLibrary("Dll.dll"); //加载动态库
    typedef int (*ADDPROC)(int a,int b); //相当于函数,函数指针类型
    ADDPROC Add=(ADDPROC)GetProcAddress(hInst,"add");  //获得函数指针
    if(!Add) 
    {
        MessageBox("获取函数地址失败");
        return;
    }
    CString str;
    str.Format("5+3=%d",Add(5,3));
    MessageBox(str);
    FreeLibrary(hInst); //释放动态链接库
}





#4


先用Depends看一下DLL中有没有入口函数 

#5


引用 3 楼 chinatcp 的回复:
C/C++ code


//DLL内容

extern "C" _declspec(dllimport)  int add(int a,int b);

int add(int a,int b)
{
    return a+b;
}


//调用方法 (调用程序和DLL.dll文件要放在同一个文件夹)
OnBtnAdd()            //调用动态链接库中……


函数获取失败。..

#6


写错了一句,把

extern "C" _declspec(dllimport) int add(int a,int b);

改为

extern "C" _declspec(dllexport) int add(int a,int b);

#7


用vc向导建一个win32 dll工程,最后一步选带sample code

#8


解决了:
完美解决方案:
1:项目属性-链接器-附加依赖项:..\..\Lib\MyDll.lib
2:项目属性-链接器-延迟加载的DLL:MyDll.dll
3:调用LoadLibrary()加载dll,最后再调用一次FreeLibrary()就行了,其他的任何东西都不需要!

如此简单啊。.........

#9


链接lib库,就不是动态加载了,根本不需要 LoadLibrary()。

引用 8 楼 weiwuyuan 的回复:
解决了:
完美解决方案:
1:项目属性-链接器-附加依赖项:..\..\Lib\MyDll.lib
2:项目属性-链接器-延迟加载的DLL:MyDll.dll
3:调用LoadLibrary()加载dll,最后再调用一次FreeLibrary()就行了,其他的任何东西都不需要!

如此简单啊。.........

#10


引用 9 楼 chinatcp 的回复:
链接lib库,就不是动态加载了,根本不需要 LoadLibrary()。


引用 8 楼 weiwuyuan 的回复:
解决了:
完美解决方案:
1:项目属性-链接器-附加依赖项:..\..\Lib\MyDll.lib
2:项目属性-链接器-延迟加载的DLL:MyDll.dll
3:调用LoadLibrary()加载dll,最后再调用一次FreeLibrary()就行了,其他的任……


这个我试过,你可以试下看看结果。

#11


引用 2 楼 weiwuyuan 的回复:
引用 1 楼 ouyh12345 的回复:
新建一个dll工程,导出符号就可以了


如果不写导出文件呢?

#ifdef XXX
 #define XXXXX __declspec(dllexport)
#else
 #define XXXXX __declspec(dllimport);
#endif

extern "C" XXXXX fun(...)
{
 ...
}

#12


引用 9 楼 chinatcp 的回复:
链接lib库,就不是动态加载了,根本不需要 LoadLibrary()。


引用 8 楼 weiwuyuan 的回复:
解决了:
完美解决方案:
1:项目属性-链接器-附加依赖项:..\..\Lib\MyDll.lib
2:项目属性-链接器-延迟加载的DLL:MyDll.dll
3:调用LoadLibrary()加载dll,最后再调用一次FreeLibrary()就行了,其他的任……


up

#13


该回复于2011-12-23 09:49:11被版主删除

#14


楼上的都没试过,试下就知道了,或者你们可以把dll的目录换到别的地方,别放在根目录下,再试下就知道效果了。
绝不是静态链接。

#15


有LIB的不需要动态加载

直接用就完了

#16


楼上的,
你建个项目随便试一下就知道你说的对不对了,同时不要把你的dll放到和你eex相同的目录下。
我很想知道你是如何加载到dll的。

#17


楼上的,
你建个项目随便试一下就知道你说的对不对了,同时不要把你的dll放到和你exe相同的目录下。
我很想知道你是如何加载到dll的。 

#18


LoadLibrary() 是加载到DLL了,但不会调用里面的函数。就算使用 LoadLibrary() 了加载了DLL。
但你用原来的方法,还是静态调用函数。而不是动态调用。建议看看孙鑫MFC视频第19章,动态链接库。

CTest test;
test.Test();
DLLTest();

#19


引用 18 楼 chinatcp 的回复:
LoadLibrary() 是加载到DLL了,但不会调用里面的函数。就算使用 LoadLibrary() 了加载了DLL。
但你用原来的方法,还是静态调用函数。而不是动态调用。建议看看孙鑫MFC视频第19章,动态链接库。

CTest test;
test.Test();
DLLTest();


lib都没链接,如何静态?? 而且,我只有一个dll,其他什么头文件,什么lib库都没有。
我问了一下,大家都说LoadLibrary()加载的就是动态加载。。
http://topic.csdn.net/u/20111226/09/93e13d52-0888-4eed-9e9c-463964ef7c4d.html

#20


引用 19 楼 weiwuyuan 的回复:
引用 18 楼 chinatcp 的回复:
LoadLibrary() 是加载到DLL了,但不会调用里面的函数。就算使用 LoadLibrary() 了加载了DLL。
但你用原来的方法,还是静态调用函数。而不是动态调用。建议看看孙鑫MFC视频第19章,动态链接库。

CTest test;
test.Test();
DLLTest();


lib都没链接,如何静态?? 而且,我……


有头文件

#21


最后的解决办法是什么?我现在也遇到了这个问题,
我在DLL里创建了几个类,现在只想LoadLibrary 和 FreeLibrary动态调用DLL,但是CTest cTest; 总是不能成功,说没有定义。谢啦
引用 20 楼 weiwuyuan 的回复:
引用 19 楼 weiwuyuan 的回复:
引用 18 楼 chinatcp 的回复:
LoadLibrary() 是加载到DLL了,但不会调用里面的函数。就算使用 LoadLibrary() 了加载了DLL。
但你用原来的方法,还是静态调用函数。而不是动态调用。建议看看孙鑫MFC视频第19章,动态链接库。

CTest test;
test.Test();
DLLTest();……

#1


新建一个dll工程,导出符号就可以了

#2


引用 1 楼 ouyh12345 的回复:
新建一个dll工程,导出符号就可以了


如果不写导出文件呢?

#3



//DLL内容

extern "C" _declspec(dllimport)  int add(int a,int b);

int add(int a,int b)
{
    return a+b;
}


//调用方法 (调用程序和DLL.dll文件要放在同一个文件夹)
OnBtnAdd() //调用动态链接库中的Add函数
{
    HINSTANCE hInst;
    hInst=LoadLibrary("Dll.dll"); //加载动态库
    typedef int (*ADDPROC)(int a,int b); //相当于函数,函数指针类型
    ADDPROC Add=(ADDPROC)GetProcAddress(hInst,"add");  //获得函数指针
    if(!Add) 
    {
        MessageBox("获取函数地址失败");
        return;
    }
    CString str;
    str.Format("5+3=%d",Add(5,3));
    MessageBox(str);
    FreeLibrary(hInst); //释放动态链接库
}





#4


先用Depends看一下DLL中有没有入口函数 

#5


引用 3 楼 chinatcp 的回复:
C/C++ code


//DLL内容

extern "C" _declspec(dllimport)  int add(int a,int b);

int add(int a,int b)
{
    return a+b;
}


//调用方法 (调用程序和DLL.dll文件要放在同一个文件夹)
OnBtnAdd()            //调用动态链接库中……


函数获取失败。..

#6


写错了一句,把

extern "C" _declspec(dllimport) int add(int a,int b);

改为

extern "C" _declspec(dllexport) int add(int a,int b);

#7


用vc向导建一个win32 dll工程,最后一步选带sample code

#8


解决了:
完美解决方案:
1:项目属性-链接器-附加依赖项:..\..\Lib\MyDll.lib
2:项目属性-链接器-延迟加载的DLL:MyDll.dll
3:调用LoadLibrary()加载dll,最后再调用一次FreeLibrary()就行了,其他的任何东西都不需要!

如此简单啊。.........

#9


链接lib库,就不是动态加载了,根本不需要 LoadLibrary()。

引用 8 楼 weiwuyuan 的回复:
解决了:
完美解决方案:
1:项目属性-链接器-附加依赖项:..\..\Lib\MyDll.lib
2:项目属性-链接器-延迟加载的DLL:MyDll.dll
3:调用LoadLibrary()加载dll,最后再调用一次FreeLibrary()就行了,其他的任何东西都不需要!

如此简单啊。.........

#10


引用 9 楼 chinatcp 的回复:
链接lib库,就不是动态加载了,根本不需要 LoadLibrary()。


引用 8 楼 weiwuyuan 的回复:
解决了:
完美解决方案:
1:项目属性-链接器-附加依赖项:..\..\Lib\MyDll.lib
2:项目属性-链接器-延迟加载的DLL:MyDll.dll
3:调用LoadLibrary()加载dll,最后再调用一次FreeLibrary()就行了,其他的任……


这个我试过,你可以试下看看结果。

#11


引用 2 楼 weiwuyuan 的回复:
引用 1 楼 ouyh12345 的回复:
新建一个dll工程,导出符号就可以了


如果不写导出文件呢?

#ifdef XXX
 #define XXXXX __declspec(dllexport)
#else
 #define XXXXX __declspec(dllimport);
#endif

extern "C" XXXXX fun(...)
{
 ...
}

#12


引用 9 楼 chinatcp 的回复:
链接lib库,就不是动态加载了,根本不需要 LoadLibrary()。


引用 8 楼 weiwuyuan 的回复:
解决了:
完美解决方案:
1:项目属性-链接器-附加依赖项:..\..\Lib\MyDll.lib
2:项目属性-链接器-延迟加载的DLL:MyDll.dll
3:调用LoadLibrary()加载dll,最后再调用一次FreeLibrary()就行了,其他的任……


up

#13


该回复于2011-12-23 09:49:11被版主删除

#14


楼上的都没试过,试下就知道了,或者你们可以把dll的目录换到别的地方,别放在根目录下,再试下就知道效果了。
绝不是静态链接。

#15


有LIB的不需要动态加载

直接用就完了

#16


楼上的,
你建个项目随便试一下就知道你说的对不对了,同时不要把你的dll放到和你eex相同的目录下。
我很想知道你是如何加载到dll的。

#17


楼上的,
你建个项目随便试一下就知道你说的对不对了,同时不要把你的dll放到和你exe相同的目录下。
我很想知道你是如何加载到dll的。 

#18


LoadLibrary() 是加载到DLL了,但不会调用里面的函数。就算使用 LoadLibrary() 了加载了DLL。
但你用原来的方法,还是静态调用函数。而不是动态调用。建议看看孙鑫MFC视频第19章,动态链接库。

CTest test;
test.Test();
DLLTest();

#19


引用 18 楼 chinatcp 的回复:
LoadLibrary() 是加载到DLL了,但不会调用里面的函数。就算使用 LoadLibrary() 了加载了DLL。
但你用原来的方法,还是静态调用函数。而不是动态调用。建议看看孙鑫MFC视频第19章,动态链接库。

CTest test;
test.Test();
DLLTest();


lib都没链接,如何静态?? 而且,我只有一个dll,其他什么头文件,什么lib库都没有。
我问了一下,大家都说LoadLibrary()加载的就是动态加载。。
http://topic.csdn.net/u/20111226/09/93e13d52-0888-4eed-9e9c-463964ef7c4d.html

#20


引用 19 楼 weiwuyuan 的回复:
引用 18 楼 chinatcp 的回复:
LoadLibrary() 是加载到DLL了,但不会调用里面的函数。就算使用 LoadLibrary() 了加载了DLL。
但你用原来的方法,还是静态调用函数。而不是动态调用。建议看看孙鑫MFC视频第19章,动态链接库。

CTest test;
test.Test();
DLLTest();


lib都没链接,如何静态?? 而且,我……


有头文件

#21


最后的解决办法是什么?我现在也遇到了这个问题,
我在DLL里创建了几个类,现在只想LoadLibrary 和 FreeLibrary动态调用DLL,但是CTest cTest; 总是不能成功,说没有定义。谢啦
引用 20 楼 weiwuyuan 的回复:
引用 19 楼 weiwuyuan 的回复:
引用 18 楼 chinatcp 的回复:
LoadLibrary() 是加载到DLL了,但不会调用里面的函数。就算使用 LoadLibrary() 了加载了DLL。
但你用原来的方法,还是静态调用函数。而不是动态调用。建议看看孙鑫MFC视频第19章,动态链接库。

CTest test;
test.Test();
DLLTest();……