在 win64 下调用 COM Server 的问题

lazy_2010 2010-02-12 02:53:28
在 win64 (win7 的 WOW64) 环境下,如下代码试图以管理员身份启动 COM Local Server ,结果总是出现问题,
但以前在 vista 的 win32 环境下测试的时候,没有这个问题,不知道什么原因,如何解决?


typedef BOOL (WINAPI *LPFN_ISWOW64PROCESS)(HANDLE, PBOOL);
/// 检查是否运行在 win64 环境下
BOOL IsRunningInWin64(void)
{
HMODULE hKernel32 = GetModuleHandle("kernel32.dll");
if (!hKernel32)
return FALSE;
LPFN_ISWOW64PROCESS pProc = (LPFN_ISWOW64PROCESS)GetProcAddress(hKernel32, "IsWow64Process");
if (!pProc)
return FALSE;
BOOL bWOW64 = FALSE;
return pProc(GetCurrentProcess(), &bWOW64) && bWOW64;
}

typedef struct tagBIND_OPTS3 : tagBIND_OPTS2
{
HWND hwnd;
}BIND_OPTS3, *LPBIND_OPTS3;

#define CLSCTX_ACTIVATE_32_BIT_SERVER 0x40000

const wchar_t MONIKER_NAME[] = L"Elevation:Administrator!new:%s";
HRESULT CoCreateInstanceAsAdmin(HWND hwnd, REFCLSID rclsid, REFIID riid, void **ppv)
{
BIND_OPTS3 bo;
wchar_t wszCLSID[50];
wchar_t wszMonikerName[300];

StringFromGUID2(rclsid, wszCLSID, _countof(wszCLSID));
HRESULT hr = StringCchPrintfW(wszMonikerName, _countof(wszMonikerName), MONIKER_NAME, wszCLSID);
if (FAILED(hr))
return hr;
memset(&bo, 0, sizeof(bo));
bo.cbStruct = sizeof(bo);
bo.hwnd = hwnd;
bo.dwClassContext = CLSCTX_LOCAL_SERVER;
// 在 WOW64 下,指定将调用 win32 的 COM Local Server
if (IsRunningInWin64())
bo.dwClassContext |= CLSCTX_ACTIVATE_32_BIT_SERVER;
// 调试输出参数
DbgPrintf("dwClassContext=0x%08x", bo.dwClassContext);
// 在 WOW64 下运行,出现 0x80004002,原因?
return CoGetObject(wszMonikerName, &bo, riid, ppv);
}
...全文
86 1 打赏 收藏 转发到动态 举报
写回复
用AI写文章
1 条回复
切换为时间正序
请发表友善的回复…
发表回复
lazy_2010 2010-02-13
  • 打赏
  • 举报
回复
不好意思,忘了注册 proxy dll 了。

18,124

社区成员

发帖
与我相关
我的任务
社区描述
Windows客户端使用相关问题交流社区
社区管理员
  • Windows客户端使用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧