私は数週間、ネイティブCLRホスティングに取り組んでいます。最初はかなりうまくいった。しかし、後で、私のアプリケーションで何かがヒープの破損を引き起こすことに気づいた。私はこれがCLR起動によって引き起こされたことを理解しました。 (次のコードのショートバージョンを参照してください。)CLR4ホスティングインターフェイスがヒープ破損を引き起こしていますか?
#pragma comment(lib, "mscoree.lib")
#include <mscoree.h>
#include <metahost.h>
#include <comdef.h>
#import "mscorlib.tlb" raw_interfaces_only \
high_property_prefixes("_get","_put","_putref") \
rename("ReportEvent", "InteropServices_ReportEvent")
using namespace mscorlib;
int _tmain(int argc, _TCHAR* argv[])
{
HRESULT hr; // In fullversion used for error detection - but here unused.
PCWSTR pszVersion = L"v4.0.30319";
ICLRMetaHost* lpMetaHost = NULL;
ICLRRuntimeInfo* lpRuntimeInfo = NULL;
ICorRuntimeHost* lpRuntimeHost = NULL;
_AppDomainPtr spAppDomain = NULL;
BOOL bLoadable = false;
IUnknownPtr spAppDomainThunk = NULL;
CLRCreateInstance(CLSID_CLRMetaHost, IID_ICLRMetaHost, (LPVOID *)&lpMetaHost);
// After this line i can "late detect" 6 array bound heap corruptions in process memory.
lpMetaHost->GetRuntime(pszVersion, IID_ICLRRuntimeInfo, (LPVOID *)&lpRuntimeInfo);
lpRuntimeInfo->IsLoadable(&bLoadable);
lpRuntimeInfo->GetInterface(CLSID_CorRuntimeHost, IID_PPV_ARGS(&lpRuntimeHost));
lpRuntimeHost->Start();
lpRuntimeHost->GetDefaultDomain(&spAppDomainThunk);
spAppDomainThunk->QueryInterface(IID_PPV_ARGS(&spAppDomain));
spAppDomainThunk->Release();
// Now I can "late detect" up to 9 array bound heap corruptions in process memory.
return 0;
}
これを回避する方法上の任意のアイデアを?現時点ではまだ動作している場合もありますが、アプリケーションが大きくなるにつれてエラーが発生する確率は急激に増加します。
あなたはエラーをチェックしておらず、NULLへのポインタを初期化していません - 完全なバージョンのコードでエラーをチェックしますか? – Justin
はい、私はHRESULTを使用していますが、私の抜粋では定義されていますが未使用です。私はちょうど私の質問を可能な限り短くしておきたいというエラーはありません。私は私の質問ではそれが注目されます。 –
ここにコードに間違いはないと思われます。 spAppDomainThunk-> Release()の直後に戻ると整流エラーが発生しますか? – elevener