読者です 読者をやめる 読者になる 読者になる

ささいなことですが。

Windowsアプリテスト自動化ライブラリFriendly開発者の日記です。

Friendly.Windows.2.6.0をリリースしました。

タイトルの通りです。
それに伴ってFriendly.Windowsを参照しているdllも更新しています。
Friendly.Windows.Grasp.2.5.1
Friendly.Windows.NativeStandardControls.2.2.3
Friendly.FormsStandardControls.2.3.2
Friendly.WPFStandardControls.1.1.5

内容は不具合修正です・・・

.NetFramework4.0をインストールしていないPCでアタッチできなかった

あれー?テストしてなかったなー。まだXPのサポート切れてなかった頃はやってたんですけどね・・・(でもたまたま)
インストーラ形式からNuget形式に変えたときにデグったようです。

原因は・・・

CLRCreateInstanceですね。ホストAPIなんですけど、.Netの4.0がインストールされていないとMSCorEE.dllに入っていないらしいです。

HRESULT hr = CLRCreateInstance(CLSID_CLRMetaHost, IID_PPV_ARGS(&pMetaHost));

修正内容

で、書き換えました。
LoadLibraryとGetProcAddressで取得して使います。
CLRCreateInstanceが取れなければ、CorBindToRuntimeEx使います。
CorBindToRuntimeExは逆に4.0以降は非推奨ですね。

//CLRCreateInstanceは4.0がインストールされていなければ存在しない
auto hMod = LoadLibrary(L"MSCorEE.dll");
auto clrCreateInstance = (CLRCreateInstanceFnPtr)GetProcAddress(hMod, "CLRCreateInstance");
if (!clrCreateInstance) {
	typedef HRESULT(__stdcall *CorBindToRuntimeExType)(LPCWSTR pwszVersion, LPCWSTR pwszBuildFlavor, DWORD startupFlags, REFCLSID rclsid, REFIID riid, LPVOID FAR *ppv);
	auto corBindToRuntimeEx = (CorBindToRuntimeExType)GetProcAddress(hMod, "CorBindToRuntimeEx");
	if (!corBindToRuntimeEx) {
		return FALSE;
	}
	HRESULT hr = corBindToRuntimeEx(szVersion, nullptr, 0, CLSID_CLRRuntimeHost, IID_PPV_ARGS(&pClrRuntimeHost));
	if (FAILED(hr)) {
		return FALSE;
	}
	return TRUE;
}

あんまり.Net4.0が入っていない環境ってないですけどね・・・。
でも、これで今まで引っかかっていた人、すみませんでした orz