2012-08-02 116 views
2

我已經使用ATL創建了簡單的COM DLL,並在其後添加了「ATL簡單對象」。爲了確保服務器正在註冊我已經放置了消息框:OLE/COM對象查看器報告STG_E_FILENOTFOUND

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

註冊沒有問題。我決定看看這個對象是如何用SDK中的OLE-COM Object Viewer查看的。查看器報告錯誤:

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

這是否意味着我的COM DLL損壞?如何讓VIewer顯示我的dll信息?

P.S. 項目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 
+1

註冊服務器並查看嵌入在DLL中的類型庫是兩個完全不同的事情。爲什麼沒有嵌入類型lib完全不清楚,請檢查項目的.rc文件。確保你的界面實際上有方法。 – 2012-08-02 12:41:24

+0

我不知道.rc文件應該是什麼。但它包含在問題描述末尾描述的3個文件夾 – vico 2012-08-02 14:16:13

+0

資源腳本引用的任何內容都不表明該DLL具有類型庫。但是它可能仍然沒問題,因爲它通常是通過'TEXTINCLUDE'部分或'.RC'文件引用的,而您並未引用該文件。 – 2012-12-14 22:21:52

回答

2

1)檢查以確保這是您的DLL的正確路徑。

2)從Visual Studio打開DLL本身並檢查以確保類型庫已嵌入到資源中。如果找不到類型庫,請添加一個。

3)如果全部失敗,您是否在管理員帳戶/ shell下注冊它。如果您調用regsvr32.exe,請確保您使用提升的權限運行。

+0

1路徑正確; 2如何檢查類型庫是否嵌入?項目包含idl文件。如果我打開DLL本身,它有文件夾「TYPELIB」,其中包含「1」,其中包含大量的二進制數據。 3 Dll在管理員權限下注冊 - 多次檢查。 – vico 2012-08-02 14:33:33

+1

我唯一的想法是嘗試構建64位(或32位,如果它已經是64位)的DLL並查看它是否適用於OleView。您還應該嘗試使用vb腳本進行實例化 - 確保嘗試使用32位和64位版本的wscpript.exe/cscript.exe。 – 2012-08-02 18:49:33

+0

如何告訴visual studio編譯32位或64位的dll? – vico 2012-08-03 11:47:51

7

收到同樣的錯誤(STG_E_FILENOTFOUND)後,看到Joe Willcoxson關於64位和32位的評論,我找到了一個解決方案。

如果您使用OleView.exe,OLE/COM Object Viewer,實際上有兩種版本:32位和64位。確保您正在啓動適當版本的OleView。 SDK的基本「BIN」文件夾中的版本將是32位版本。 「x64」文件夾將具有該應用程序的64位版本,該版本與舊版二進制文件及其typelib(在32位世界中製作)不完全兼容。另一方面,如果您的新DLL正在爲x64編譯,那麼很有可能32位OleView將無法正確讀取數據。