QT 加载 MFC 的 dll

来源:互联网 发布:linux端口查询命令 编辑:程序博客网 时间:2024/05/29 14:17

之前一直被网上言论所吓倒,以为QT加载不了MFC的dll,网上也没有成功的例子。

弄了几天,原来发现还是可以的。 

(之前试过静态加载,确实是不行,下面是用LoadLibrary方法来动态加载)

方法一:

#include <QtCore/QCoreApplication>
#include <Windows.h>
#include <string>
int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);


    std::string* buffer1;  //这个String的指针,只是个人习惯,可以不用指针,可以用char* 或者QString

     std::string* buffer2;

    buffer1 = new std::string(); 

    buffer2 = new std::string(); 

    buffer1->clear();

    buffer1->append("C:\\xxx.dll"); //注意这里路径需要两个反斜杠

    HMODULE tmp = LoadLibraryA(buffer1->c_str());//开始加载Dll 这个HMODULE 跟上面的windows.h相关联

//    DLLPREFIX HCLOBJ DLLENTRY Test( LPCTSTR a, LPCTSTR b ); //dll所对应的.h的函数声明

  typedef long (CALLBACK *function)( const char* a, const char* b); //对应上面的函数,声明一个本地函数指针  注意 LPCTSTR 对应于 const char* 这里的CALLBACK很重要,不能掉,因为上面.h文件函数声明时有DLLENTRY(就等于这里的CALLBACK),这个CALLBACK 跟上面的windows.h相关联
    buffer1->clear();
    buffer1->append("Test"); //这个名称跟.h里的函数名对应
    function test=(function)GetProcAddress(tmp,buffer1->c_str()); //指针强转
    buffer1->clear();
    buffer2->clear();
    buffer1->append("A");
    buffer2->append("B");
    test(buffer1->c_str(),buffer2->c_str());//这里就可以用这个test函数了。

    FreeLibrary(tmp); //卸载该dll

     if(buffer1!=NULL)
    {
        delete  buffer1;
        buffer1 = NULL;
    }
    if(buffer2!=NULL)
    {
        delete  buffer2;
        buffer2 = NULL;
    }

    return a.exec();
}




0 0
原创粉丝点击