QT加载.dll不调用resolve

Posted

技术标签:

【中文标题】QT加载.dll不调用resolve【英文标题】:QT load .dll not calling resolve 【发布时间】:2017-07-20 03:26:43 【问题描述】:

出于某种原因,我可以将我的 .dll 加载到我的应用程序中,但是当我调用解析函数时,它一直说无法加载函数。

typedef void (*SetKey_func)(const char *, const char *, const char *, const char *);

Crypt::Crypt(QObject *parent) : QObject(parent)



Crypt::~Crypt()




void Crypt::LoadCrypt()
    

        QString file = QCoreApplication::applicationDirPath() + "/RockBase.dll";

        library.setFileName(file);
        library.load();

        if( !library.isLoaded() )
        
            //file not loaded
            return;
        
        else
        
            // file loaded
        
    

然后我的函数 decsetkey 只是在 .dll 中设置密钥

void Crypt::DecSetKey()


    quint8 decKey1[] =  0x7D, 0x44, 0x01, 0x00, 0x83, 0xEC, 0x24, 0x83, 0x25, 0xB8, 0x8C, 0x4A, 0x0D, 0x56, 0x8B, 0x75 ;
    quint8 decKey2[] =  0x1C, 0x8D, 0x1C, 0x57, 0x50, 0xCE, 0xE8, 0x6F, 0x85, 0xFE, 0xFF, 0x8B ;
    quint8 decKey3[] =  0x76, 0x0C, 0x50, 0x45, 0x14, 0x83, 0x65, 0xFC, 0x56, 0x50, 0x7D, 0xD1, 0x74, 0x03, 0xB8, 0x43 ;
    quint8 decKey4[] =  0x8B, 0x47, 0xDD, 0x6A, 0xE8, 0x14, 0x83, 0xC4, 0xBC, 0xF3, 0x7F, 0x75 ;

    SetKey_func s_d_func = (SetKey_func)library.resolve( "?SetKey@CCrypto@RockBase@@QAEXPBD000@Z" );
    if( s_d_func )
    
        //"Successful loading of Decrypt CCrypto::SetKey function."));
        s_d_func( 0, (const char*)decKey1, 0, 0 );
        s_d_func((const char*)decKey2, 0, 0, 0);
        s_d_func(0, (const char*)decKey3, 0, 0);
        s_d_func((const char*)decKey4, 0, 0, 0);
    
    else
    
        //Unable to load Decrypt CCrypto::SetKey function."));
    

我在另一个类中调用函数

void patch::readdata()

        Crypt *cryptinstance = new Crypt(this);
        cryptinstance->DecSetKey();

我认为指针在我访问它后会被破坏。任何帮助都会有所帮助,感谢您的宝贵时间。

【问题讨论】:

做一个dumpbin /exports Rockbase.dll。你确定你有正确的名称错位函数签名吗?此外,您可能真的想导出一个扁平的“extern C”函数而不是 C++ 函数。 是的,名字被破坏了,我无法访问 lib 或头文件,只有 .dll 任何建议 把 DLL 分享出来,我可能会告诉你出了什么问题...... /* 视觉工作室 c++ 6.0 (.dll) ;导出条目 119。 ?SetKey@CRockCrypto@RockBase@@QAEXPBD000@Z ;属性:基于bp的帧; void __thiscall RockBase::CRockCrypto::SetKey(RockBase::CRockCrypto this, const char *, const char *, const char *, const char *) public ?SetKey@CRockCrypto@RockBase@@QAEXPBD000@Z ?SetKey@ CRockCrypto@RockBase@@QAEXPBD000@Z proc near */ 这应该是: typedef void (*SetKey_func)(void thisPtr,const char *, const char *, const char *, const char *);然后我会得到类实例ptr。但不知道该怎么做。 从字面上看,我的意思是,给我发一份 DLL 的副本。 【参考方案1】:

从命令行执行dumpbin /exports RockBaseML.dll。您会看到没有像 ?SetKey@CCrypto@RockBase@@QAEXPBD000@Z 这样的导出函数,因为您的代码尝试搜索。我找到的最接近的是这套:

C:\Users\jselbie\Downloads>dumpbin /exports RockBaseML.dll | findstr /i SetKey
    116   73 00004DCF ?SetKey@CAesCrypto@RockBase@@UAEXPBD@Z
    117   74 00004F3D ?SetKey@CDesCrypto@RockBase@@UAEXPBD@Z
    118   75 00005051 ?SetKey@CRcCrypto@RockBase@@UAEXPBD@Z
    119   76 0000525E ?SetKey@CRockCrypto@RockBase@@QAEXPBD000@Z
    120   77 000054F2 ?SetKey@CStrmCrypto@RockBase@@UAEXPBD@Z

【讨论】:

?SetKey@CRockCrypto@RockBase@@QAEXPBD000@Z 是我对源代码中的拼写错误感到抱歉.. 您能解释一下为什么我的 .dll 不能正常工作吗?我加载 dll 抓取过程,通过参数传递一个函数,它只是崩溃任何想法为什么? 对不起。 DLL 依赖于我没有的其他 DLL。我没有足够的继续。我试过了。 很抱歉应该发布另一个。在这里试试这个,看看你能想出什么谢谢你的帮助..s000.tinyupload.com/?file_id=85382418382697538359

以上是关于QT加载.dll不调用resolve的主要内容,如果未能解决你的问题,请参考以下文章

怎么将qt的开源库封装成dll

qt加载dll

QT 中的延迟 DLL 加载

Qt系列文章之三十八(基于QWidget 创建和使用动态dll共享库)

window下C#(winform)调用带界面的Qt库文件(DLL)

window下C#(winform)调用带界面的Qt库文件(DLL)