C++ 延迟加载加密++;cryptopp.dll

C++ 延迟加载加密++;cryptopp.dll,c++,dll,crypto++,delay-load,C++,Dll,Crypto++,Delay Load,Crypto++库通过编译cryptolib.lib和cryptopp.lib支持后期绑定。这需要使用cryptopp.dll。当尝试通过/DELAYLOAD:cryptopp.dll延迟加载此dll时,会导致链接错误,由于需要导入,无法延迟加载 例如,请参见以下代码: #include <Crypto++/dll.h> #include <crypto++/base64.h> bool HexDecode(const std::string& strHex,

Crypto++库通过编译
cryptolib.lib
cryptopp.lib
支持后期绑定。这需要使用
cryptopp.dll
。当尝试通过
/DELAYLOAD:cryptopp.dll
延迟加载此dll时,会导致链接错误,由于需要导入,无法延迟加载

例如,请参见以下代码:

#include <Crypto++/dll.h>
#include <crypto++/base64.h>

bool HexDecode(const std::string& strHex, std::string& strData)
{
    try
    {
        CryptoPP::StringSource(strHex, true,
            new CryptoPP::Base64Decoder(
                new CryptoPP::StringSink(strData)));
    }

    catch(...)
    {
        return false;
    }

    return true;
}
是否有人已成功延迟加载
cryptopp.dll

Crypto++库通过编译cryptolib.lib和cryptopp.lib来支持后期绑定

该DLL是一个FIPS DLL。将功能拆分为两个独立库的实际目的是提供FIPS 140-2所需的逻辑模块边界。FIPS模块边界为
cryptopp.dll

FIPS DLL仅包括FIPS算法,如AES和RSA。我建议您不惜一切代价避免使用FIPS DLL。工作起来很痛苦。另请参见Crypto++wiki上的

如果您想要一个DLL,那么使用自己的API编写自己的包装器DLL,然后链接到Crypto++静态库

在wrapper DLL的情况下(而且因为您似乎有经验),我强烈建议您使用它作为起点。如果您熟悉makefiles(我想您是),那么您会发现使用makefiles比使用makefiles容易得多


链接:致命错误LNK1194:无法延迟加载“cryptopp.dll”,因为导入了数据符号“\uu declspec(dllimport)bool(\uu cdecl*cryptopp::g\u passignnttointeger)(类类型\u info const&,void*,void const*)”(\uu imp\ug)_pAssignIntToInteger@CryptoPP@@3P6A_NABVtype_信息@@PAXPBX@ZA)". 不带/DELAYLOAD的链接:cryptopp.dll

这是一个有趣的问题,因为您有两个库,我不清楚符号在哪个库中。第一个库是FIPS DLL(cryptopp.DLL),它包括AES、RSA等。第二个库是静态库(cryptolib.Lib),它包括HexEncoder、FileSource和其他支持内容

我相信
g_passignintotointeger
应该在静态库(cryptlib.Lib)中,因为它是
算法参数的一部分。例如,请参见。但是,从上面的错误来看,由于符号名
\uuuu imp\uu?g\u passignintotointeger…
,它似乎驻留在FIPS DLL中

现在增加的问题是,
g_passignintotointeger
是一个函数指针,编译器不会对它们进行优化。所以链接器从不丢弃
Integer
相关符号,这就是解耦的关键

此时,我们删除了
g\u passigninto INTEGER
,并添加了define
CRYPTOPP\u NO\u ASSIGN\u TO\u INTEGER
,以完成任务。定义确保可以丢弃符号和不需要的代码,如
Integer
code

Crypto++库通过编译cryptolib.lib和cryptopp.lib来支持后期绑定

该DLL是一个FIPS DLL。将功能拆分为两个独立库的实际目的是提供FIPS 140-2所需的逻辑模块边界。FIPS模块边界为
cryptopp.dll

FIPS DLL仅包括FIPS算法,如AES和RSA。我建议您不惜一切代价避免使用FIPS DLL。工作起来很痛苦。另请参见Crypto++wiki上的

如果您想要一个DLL,那么使用自己的API编写自己的包装器DLL,然后链接到Crypto++静态库

在wrapper DLL的情况下(而且因为您似乎有经验),我强烈建议您使用它作为起点。如果您熟悉makefiles(我想您是),那么您会发现使用makefiles比使用makefiles容易得多


链接:致命错误LNK1194:无法延迟加载“cryptopp.dll”,因为导入了数据符号“\uu declspec(dllimport)bool(\uu cdecl*cryptopp::g\u passignnttointeger)(类类型\u info const&,void*,void const*)”(\uu imp\ug)_pAssignIntToInteger@CryptoPP@@3P6A_NABVtype_信息@@PAXPBX@ZA)". 不带/DELAYLOAD的链接:cryptopp.dll

这是一个有趣的问题,因为您有两个库,我不清楚符号在哪个库中。第一个库是FIPS DLL(cryptopp.DLL),它包括AES、RSA等。第二个库是静态库(cryptolib.Lib),它包括HexEncoder、FileSource和其他支持内容

我相信
g_passignintotointeger
应该在静态库(cryptlib.Lib)中,因为它是
算法参数的一部分。例如,请参见。但是,从上面的错误来看,由于符号名
\uuuu imp\uu?g\u passignintotointeger…
,它似乎驻留在FIPS DLL中

现在增加的问题是,
g_passignintotointeger
是一个函数指针,编译器不会对它们进行优化。所以链接器从不丢弃
Integer
相关符号,这就是解耦的关键

此时,我们删除了
g\u passigninto INTEGER
,并添加了define
CRYPTOPP\u NO\u ASSIGN\u TO\u INTEGER
,以完成任务。定义确保可以丢弃符号和不需要的代码,如
Integer
code

LINK : fatal error LNK1194: Delay loading "cryptopp.dll" not possible because of import of data symbol ""__declspec(dllimport) bool (__cdecl* CryptoPP::g_pAssignIntToInteger)(class type_info const &,void *,void const *)" (__imp_?g_pAssignIntToInteger@CryptoPP@@3P6A_NABVtype_info@@PAXPBX@ZA)". Link without /DELAYLOAD:cryptopp.dll