+ -
当前位置:首页 → 问答吧 → 求好心人写个动态加载dll的代码。。。

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

时间:2011-12-22

来源:互联网

我先给个框架:
C/C++ code

// 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函数都没跑进去- -

作者: weiwuyuan   发布时间: 2011-12-22

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

作者: ouyh12345   发布时间: 2011-12-22

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


如果不写导出文件呢?

作者: weiwuyuan   发布时间: 2011-12-22

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()            //调用动态链接库中的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);            //释放动态链接库
}






作者: chinatcp   发布时间: 2011-12-22

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

作者: liujie250079934   发布时间: 2011-12-22

引用 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() //调用动态链接库中……


函数获取失败。..

作者: weiwuyuan   发布时间: 2011-12-22

写错了一句,把

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

改为

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

作者: chinatcp   发布时间: 2011-12-22

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

作者: buyong   发布时间: 2011-12-22

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

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

作者: weiwuyuan   发布时间: 2011-12-22

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

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

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

作者: chinatcp   发布时间: 2011-12-22