求助!注册COM组件失败

tg1671028 2015-10-15 06:24:01
小弟最近闲来无事翻了翻COM技术的东西(以丰富自己的知识库作为目的)

跟着教程做了一个简单的DEMO,该COM组件是Inprocess Server,说白了就是一个普通的DLL,用户调用的时候提交两个整数a和b,该组件给出a+b的值,用VS创建了一个Win32 DLL项目,现在要把COM组件注册到系统上,卡住了

这个项目我暂且称之为Fooo

实现组件注册的源代码如下(模仿Don Box的Essential COM中的做法)

Registry.cpp


#include "stdafx.h"
#include "Registry.h"
#include "Global.h"

const char *g_RegTable[][3] = {
// format is { key, value name, value}
{ "CLSID\\{F8771B89-7971-4085-8D5F-88F7C140698B}", 0, "FastAddition" },
{ "CLSID\\{F8771B89-7971-4085-8D5F-88F7C140698B}\\InprocServer32", 0,
(const char*)-1 // rogue value indicating file name
},
{ "CLSID\\{F8771B89-7971-4085-8D5F-88F7C140698B}\\ProgID", 0, "Fooo.FastAddition.1" },
{ "Fooo.FastAddition.1", 0, "FastAddition" },
{ "Fooo.FastAddition.1\\CLSID", 0, "{F8771B89-7971-4085-8D5F-88F7C140698B}" },
};

STDAPI DllRegisterServer(void){
HRESULT hr = S_OK;
// look up server's file name
char szFileName[MAX_PATH];
GetModuleFileNameA(g_hModule, szFileName, MAX_PATH);
// register entries from table
int nEntries = sizeof(g_RegTable) / sizeof(*g_RegTable);
for (int i = 0; SUCCEEDED(hr) && i < nEntries; i++) {
const char *pszKeyName = g_RegTable[i][0];
const char *pszValueName = g_RegTable[i][1];
const char *pszValue = g_RegTable[i][2];
// map rogue value to module file name
if (pszValue == (const char*)-1)
pszValue = szFileName;
HKEY hkey;
// create the key
long err = RegCreateKeyA(HKEY_CLASSES_ROOT,
pszKeyName, &hkey);
if (err == ERROR_SUCCESS) {
// set the value
err = RegSetValueExA(hkey, pszValueName, 0,
REG_SZ, (const BYTE*)pszValue,
(strlen(pszValue) + 1));
RegCloseKey(hkey);
}
else {
// if cannot add key or value, back out and fail
DllUnregisterServer();
hr = SELFREG_E_CLASS;
}
}
return hr;
}

STDAPI DllUnregisterServer(void){
HRESULT hr = S_OK;
int nEntries = sizeof(g_RegTable) / sizeof(*g_RegTable);
for (int i = nEntries - 1; i >= 0; i--){
const char *pszKeyName = g_RegTable[i][0];
long err = RegDeleteKeyA(HKEY_CLASSES_ROOT, pszKeyName);
if (err != ERROR_SUCCESS)
hr = S_FALSE;
}
return hr;
}


其中Global.h就是定义了两个全局变量,一个是int类型的用作这个组件的内部运算。还有一个是HMODULE保存这个DLL的句柄

项目生成了Fooo.dll

我使用的是Windows 7-64

管理员权限打开cmd,切换到C:\windows\syswow64,执行命令:

regsvr32 e:\FoooSln\Release\Fooo.dll


提示我:

DllRegisterServer in E:\FoooSln\Release\Fooo.dll succeeded.

但是我去注册表查看HKEY_CLASSES_ROOT\CLSID却看不到我注册的信息(当然我搜索了一下注册表,还是没搜到)

请问各位,这可能是什么原因导致注册不成功的?万分感谢!
...全文
2399 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
ccrun.com 2015-10-16
  • 打赏
  • 举报
回复
在 DllRegisterServer 函数内加入一些日志输出,比如用OutputDebugString 看看写注册表成功否。
tg1671028 2015-10-16
  • 打赏
  • 举报
回复
引用 1 楼 ccrun 的回复:
在 DllRegisterServer 函数内加入一些日志输出,比如用OutputDebugString 看看写注册表成功否。
我用管理员权限打开VS调试,就没有报错了。所有操作都是成功的但是还是在注册表找不到写的键值。
tg1671028 2015-10-16
  • 打赏
  • 举报
回复
引用 1 楼 ccrun 的回复:
在 DllRegisterServer 函数内加入一些日志输出,比如用OutputDebugString 看看写注册表成功否。
调试了一下,第36行返回错误码0x5,用FormatMessage查看了一下是Access is denied. 拒绝访问

703

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder ActiveX/COM/DCOM
社区管理员
  • ActiveX/COM/DCOM社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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