我使用ATL创建了简单的COM DLL,之后添加了“ATL Simple Object”。为了确保服务器正在注册,我已经放置了messagebox:
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信息?
P.S。 项目RC文件contians:
“REGISTRY”
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
答案 0 :(得分:7)
收到相同的错误(STG_E_FILENOTFOUND),并看到Joe Willcoxson关于64位和32位的评论后,我找到了解决方案。
如果您使用的是OleView.exe,OLE / COM对象查看器,实际上有两个版本:32位和64位。确保使用正确版本的OleView启动。 SDK的基本“BIN”文件夹中的版本将是32位版本。 “x64”文件夹将具有该应用程序的64位版本,该版本与旧版二进制文件及其类型库(在32位世界中制作)不完全兼容。
另一方面,如果您的新DLL正在为x64进行编译,那么32位OleView很可能无法正确读取数据。
答案 1 :(得分:2)
1)检查以确保它是DLL的正确路径。
2)从Visual Studio打开DLL本身并检查以确保资源中嵌入了类型库。如果找不到类型库,请添加一个。
3)如果全部失败,您是否在管理员帐户/ shell下注册了它。如果您在其上调用regsvr32.exe,请确保使用提升的权限运行。