// CLRホストを作成して呼び出すサンプル
#include <Mscoree.h>
#pragma comment(lib, "Mscoree.lib")
#import "C:\\\\WINDOWS\\\\Microsoft.NET\\\\Framework\\\\v1.1.4322\\\\Mscorlib.tlb" raw_interfaces_only
using namespace mscorlib;
void main()
{
HRESULT hr;
// CLRにバインドする
ICorRuntimeHost* pHost = NULL;
hr = CorBindToRuntimeEx(L"v1.1.4322", L"wks", 0, CLSID_CorRuntimeHost, IID_ICorRuntimeHost, (void**)&pHost);
if (SUCCEEDED(hr))
{
// ホストを開始する
pHost->Start();
// アプリケーションドメイン(IUnknown)の取得
IUnknown* pUnkAppDomain;
hr = pHost->GetDefaultDomain(&pUnkAppDomain);
if (SUCCEEDED(hr))
{
// アプリケーションドメイン(_AppDomain)の取得
_AppDomain* pAppDomain = NULL;
hr = pUnkAppDomain->QueryInterface(__uuidof(_AppDomain), (void**)&pAppDomain);
if (SUCCEEDED(hr))
{
// ManagedLibrary.dllからManagedLibrary.Class1のインスタンス生成
_ObjectHandle* pObjHandle = NULL;
hr = pAppDomain->CreateInstanceFrom(_bstr_t("c:\\\\ManagedLibrary.dll"), _bstr_t("ManagedLibrary.Class1"), &pObjHandle);
if (SUCCEEDED(hr))
{
VARIANT vtUnwrapped;
pObjHandle->Unwrap(&vtUnwrapped);
if (SUCCEEDED(hr) && vtUnwrapped.vt == VT_DISPATCH)
{
IDispatch* pDisp = vtUnwrapped.pdispVal;
// Method1のDISPIDを取得
DISPID dispid = 0;
OLECHAR* pszName[] = {L"Method1"};
hr = pDisp->GetIDsOfNames(IID_NULL, pszName, 1, LOCALE_SYSTEM_DEFAULT, &dispid);
if (SUCCEEDED(hr))
{
// Method1のパラメータ設定
DISPPARAMS params;
params.rgvarg = NULL;
params.rgdispidNamedArgs = NULL;
params.cArgs = 0;
params.cNamedArgs = 0;
// Method1を呼び出す
pDisp->Invoke(dispid, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_METHOD, ¶ms, NULL, NULL, NULL);
}
pDisp->Release();
}
pObjHandle->Release();
}
pAppDomain->Release();
}
pUnkAppDomain->Release();
}
// ホスト停止する
pHost->Stop();
pHost->Release();
}
}
|