// 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
如果不写导出文件呢?
#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
函数获取失败。..
#6
写错了一句,把
extern "C" _declspec(dllimport) int add(int a,int b);
改为
extern "C" _declspec(dllexport) int add(int a,int b);
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()就行了,其他的任何东西都不需要!
如此简单啊。.........
完美解决方案:
1:项目属性-链接器-附加依赖项:..\..\Lib\MyDll.lib
2:项目属性-链接器-延迟加载的DLL:MyDll.dll
3:调用LoadLibrary()加载dll,最后再调用一次FreeLibrary()就行了,其他的任何东西都不需要!
如此简单啊。.........
#9
链接lib库,就不是动态加载了,根本不需要 LoadLibrary()。
#10
这个我试过,你可以试下看看结果。
#11
#ifdef XXX
#define XXXXX __declspec(dllexport)
#else
#define XXXXX __declspec(dllimport);
#endif
extern "C" XXXXX fun(...)
{
...
}
#12
up
#13
#14
楼上的都没试过,试下就知道了,或者你们可以把dll的目录换到别的地方,别放在根目录下,再试下就知道效果了。
绝不是静态链接。
绝不是静态链接。
#15
有LIB的不需要动态加载
直接用就完了
直接用就完了
#16
楼上的,
你建个项目随便试一下就知道你说的对不对了,同时不要把你的dll放到和你eex相同的目录下。
我很想知道你是如何加载到dll的。
你建个项目随便试一下就知道你说的对不对了,同时不要把你的dll放到和你eex相同的目录下。
我很想知道你是如何加载到dll的。
#17
楼上的,
你建个项目随便试一下就知道你说的对不对了,同时不要把你的dll放到和你exe相同的目录下。
我很想知道你是如何加载到dll的。
你建个项目随便试一下就知道你说的对不对了,同时不要把你的dll放到和你exe相同的目录下。
我很想知道你是如何加载到dll的。
#18
LoadLibrary() 是加载到DLL了,但不会调用里面的函数。就算使用 LoadLibrary() 了加载了DLL。
但你用原来的方法,还是静态调用函数。而不是动态调用。建议看看孙鑫MFC视频第19章,动态链接库。
CTest test;
test.Test();
DLLTest();
但你用原来的方法,还是静态调用函数。而不是动态调用。建议看看孙鑫MFC视频第19章,动态链接库。
CTest test;
test.Test();
DLLTest();
#19
lib都没链接,如何静态?? 而且,我只有一个dll,其他什么头文件,什么lib库都没有。
我问了一下,大家都说LoadLibrary()加载的就是动态加载。。
http://topic.csdn.net/u/20111226/09/93e13d52-0888-4eed-9e9c-463964ef7c4d.html
#20
有头文件
#21
最后的解决办法是什么?我现在也遇到了这个问题,
我在DLL里创建了几个类,现在只想LoadLibrary 和 FreeLibrary动态调用DLL,但是CTest cTest; 总是不能成功,说没有定义。谢啦
我在DLL里创建了几个类,现在只想LoadLibrary 和 FreeLibrary动态调用DLL,但是CTest cTest; 总是不能成功,说没有定义。谢啦
#1
新建一个dll工程,导出符号就可以了
#2
如果不写导出文件呢?
#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
函数获取失败。..
#6
写错了一句,把
extern "C" _declspec(dllimport) int add(int a,int b);
改为
extern "C" _declspec(dllexport) int add(int a,int b);
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()就行了,其他的任何东西都不需要!
如此简单啊。.........
完美解决方案:
1:项目属性-链接器-附加依赖项:..\..\Lib\MyDll.lib
2:项目属性-链接器-延迟加载的DLL:MyDll.dll
3:调用LoadLibrary()加载dll,最后再调用一次FreeLibrary()就行了,其他的任何东西都不需要!
如此简单啊。.........
#9
链接lib库,就不是动态加载了,根本不需要 LoadLibrary()。
#10
这个我试过,你可以试下看看结果。
#11
#ifdef XXX
#define XXXXX __declspec(dllexport)
#else
#define XXXXX __declspec(dllimport);
#endif
extern "C" XXXXX fun(...)
{
...
}
#12
up
#13
#14
楼上的都没试过,试下就知道了,或者你们可以把dll的目录换到别的地方,别放在根目录下,再试下就知道效果了。
绝不是静态链接。
绝不是静态链接。
#15
有LIB的不需要动态加载
直接用就完了
直接用就完了
#16
楼上的,
你建个项目随便试一下就知道你说的对不对了,同时不要把你的dll放到和你eex相同的目录下。
我很想知道你是如何加载到dll的。
你建个项目随便试一下就知道你说的对不对了,同时不要把你的dll放到和你eex相同的目录下。
我很想知道你是如何加载到dll的。
#17
楼上的,
你建个项目随便试一下就知道你说的对不对了,同时不要把你的dll放到和你exe相同的目录下。
我很想知道你是如何加载到dll的。
你建个项目随便试一下就知道你说的对不对了,同时不要把你的dll放到和你exe相同的目录下。
我很想知道你是如何加载到dll的。
#18
LoadLibrary() 是加载到DLL了,但不会调用里面的函数。就算使用 LoadLibrary() 了加载了DLL。
但你用原来的方法,还是静态调用函数。而不是动态调用。建议看看孙鑫MFC视频第19章,动态链接库。
CTest test;
test.Test();
DLLTest();
但你用原来的方法,还是静态调用函数。而不是动态调用。建议看看孙鑫MFC视频第19章,动态链接库。
CTest test;
test.Test();
DLLTest();
#19
lib都没链接,如何静态?? 而且,我只有一个dll,其他什么头文件,什么lib库都没有。
我问了一下,大家都说LoadLibrary()加载的就是动态加载。。
http://topic.csdn.net/u/20111226/09/93e13d52-0888-4eed-9e9c-463964ef7c4d.html
#20
有头文件
#21
最后的解决办法是什么?我现在也遇到了这个问题,
我在DLL里创建了几个类,现在只想LoadLibrary 和 FreeLibrary动态调用DLL,但是CTest cTest; 总是不能成功,说没有定义。谢啦
我在DLL里创建了几个类,现在只想LoadLibrary 和 FreeLibrary动态调用DLL,但是CTest cTest; 总是不能成功,说没有定义。谢啦