ライブラリは Visual Studio 2010 では問題なく動作していましたが、2012 でコンパイルして実行すると、次のようなメモリ エラーが発生します。
First-chance exception at 0x76884B32 in Example.exe: Microsoft C++ exception: std::bad_alloc at memory location 0x0101F3A0.
First-chance exception at 0x76884B32 in Example.exe: Microsoft C++ exception: std::bad_alloc at memory location 0x0101F3A0.
Unhandled exception at at 0x76884B32 in Example.exe: Microsoft C++ exception: std::bad_alloc at memory location 0x0101F3A0.
First-chance exception at 0x76FF3541 (ntdll.dll) in Example.exe: 0xC0000005: Access violation reading location 0xFEFEFF02.
コール スタックによるとreturn wstring(cMD5.hexdigest());
、次のコードから呼び出されるたびにエラーが発生します。
wstring GetMachineHash() {
BYTE szHash[48];
LPBYTE pIdentifierHash;
ZeroMemory(szHash, 48);
MachineNameIdentifier cNameId;
pIdentifierHash = cNameId.GetIdentifierHash();
memcpy(szHash, pIdentifierHash, 16);
NetworkAdapterIdentifier cNetAdaptId;
pIdentifierHash = cNetAdaptId.GetIdentifierHash();
memcpy(szHash+16, pIdentifierHash, 16);
VolumeInfoIdentifier cVolInfo;
pIdentifierHash = cVolInfo.GetIdentifierHash();
memcpy(szHash+32, pIdentifierHash, 16);
MD5 cMD5(szHash, 48);
return wstring(cMD5.hexdigest());
}
私が使用している MD5 クラスについて疑問がある場合は、Frank Thilo による 1 つのポートですが、次のように std::string の代わりに LPBYTE を返すように変更されています。
// return 16 byte md5 hash
LPBYTE MD5::hash() const {
if (!finalized)
return 0;
return (LPBYTE)digest;
}
// return hex representation of digest as string
LPTSTR MD5::hexdigest() const
{
if (!finalized)
return NULL;
LPTSTR szBuf = new TCHAR[33];
ZeroMemory(szBuf, 33);
for (int i=0; i<16; i++)
_stprintf_s(szBuf+i*2, 33, _T("%02X"), digest[i]);
szBuf[32]=0;
return szBuf;
}
ここで SO についていくつかの調査を行った後、これらのエラーは、プログラムの別の場所でメモリ リークが発生している可能性があるためであると言われています。しかし、私が見たところ、すべてが正しく解放されているようです。何か案は?LoadLibrary()
これがEXEからDLLライブラリを呼び出すことと関係があるのではないかと思っていましたGetProcAddress()
。
(プラットフォーム ツールセットが に設定されていることにも注意してくださいVisual Studio 2012 - Windows XP (v110_xp)
)