2

我使用 ATL 创建了简单的 COM DLL,然后添加了“ATL 简单对象”。为了确保服务器正在注册,我放置了消息框:

STDAPI DllRegisterServer(void)
{
     MessageBoxA ( NULL, "Hello World!", "Test", MB_OK );
    HRESULT hr = _AtlModule.DllRegisterServer();
        return hr;
}

注册就好了。我决定使用作为 SDK 一部分的 OLE-COM 对象查看器来查看该对象的外观。查看器报告错误:

 "LoadTypelib'(c:\pr\ILight.dll) failed. 
 <No system message defined> STG_E_FILENOTFOUND ($800300002)

这是否意味着我的 COM dll 已损坏?如何让 VIewer 显示我的 dll 信息?

PS Project RC 文件包含:

“登记处”

IDR_ILIGHT
    HKCR{}
IDR_LIGHT
    HKCR
    {
AboutiLight.1 = s 'Light Class'
{
    CLSID = s '{DBC53EA8-A51E-4374-B104-06A834273B0C}'
}
AboutiLight = s 'Light Class'
{       
    CurVer = s 'AboutiLight.1'
}
NoRemove CLSID
{
    ForceRemove {DBC53EA8-A51E-4374-B104-06A834273B0C} = s 'Light Class'
    {
        ProgID = s 'AboutiLight.1'
        VersionIndependentProgID = s 'AboutiLight'
        ForceRemove Programmable
        InprocServer32 = s '%MODULE%'
        {
            val ThreadingModel = s 'Apartment'
        }
        TypeLib = s '{1D9F859D-10FF-4827-A341-4A8B8E318A61}'
        Version = s '1.0'
    }
}
    }

字符串表

String table
ID=IDS_PROJNAME Value=100 Caption ILight

版本

VS_VERSION_INFO
FILEVERSION 1,0,0,1
PRODUCTVERSION 1,0,0,1
FILEMASK 0x3fL
FILEFLAGS 0x0L
FILEOS VOS_NT_WINDOWS32
FILETYPE VFT_DLL
FILESUBTYPE VFT2_UNKNOWN
4

2 回答 2

8

在收到相同的错误 (STG_E_FILENOTFOUND) 并看到 Joe Willcoxson 关于 64 位和 32 位的评论后,我找到了解决方案。

如果您使用的是 OleView.exe,即 OLE/COM 对象查看器,实际上它有两个版本:32 位和 64 位。确保您使用正确版本的 OleView 启动。SDK 的基本“BIN”文件夹中的版本将是 32 位版本。“x64”文件夹将包含 64 位版本的应用程序,它与旧的二进制文件及其类型库(在 32 位世界中制作)不完全兼容。

另一方面,如果您的新 DLL 正在为 x64 积极编译,那么 32 位 OleView 很可能也无法正确读取数据。

于 2012-12-14T20:20:48.210 回答
2

1) 检查以确保这是您的 DLL 的正确路径。

2) 从 Visual Studio 打开 DLL 本身并检查以确保资源中嵌入了类型库。如果找不到类型库,请添加一个。

3)如果一切都失败了,你是否在管理员帐户/shell下注册了它。如果您在其上调用 regsvr32.exe,请确保您以提升的权限运行。

于 2012-08-02T12:37:28.383 回答