2012-03-08 100 views
2

我寫了一個C#.NET Com可調用包裝器DLL。我用StrongName對它進行了簽名,並使用64位regasm.exe註冊了代碼庫和typelib。使用64位OleViewer可以看到註冊和所有控件的方法。然而,當我嘗試使用控制從64位\ Windows \ System32下\的Cscript.exe:如何解決.NET COM Callable Wrapper DLL的註冊/使用問題?

Set logger = CreateObject("MyCompany.LoggerControl") 

這將產生錯誤:

Microsoft VBScript runtime error: ActiveX component can't create object: 'MyCompany.LoggerControl'

是sysutils使用procmon中跟蹤下來,我找到:

1:41:44.8295486 PM cscript.exe 24028 RegOpenKey HKCR\MyCompany.LoggerControl
NAME NOT FOUND Desired Access: Read

但是,這個鍵存在於Regedit中。調用進程從提升的命令提示符運行。如果這是一個安全問題,錯誤是不是'訪問被拒絕'而不是'未找到名稱'?

什麼是追蹤這種類型的COM控件註冊錯誤的其他工具?

+1

有沒有這樣的 「HKCR \ MyCompany.LoggerControl」 和能不能訪問?確保從*相同的bitness * regedit中查找,然後仔細檢查正在執行的程序的位數,以確保沒有發生任何有趣的事情。 (任務管理器中的「*」後綴= 32位。) – 2012-03-08 19:11:17

回答

1

這裏有一對夫婦的故障診斷思路:

  1. 確定試圖創建對象時返回的確切錯誤編號:

    上的錯誤繼續下一步
    設置記錄器=的CreateObject(「MyCompany的.LoggerControl「)
    如果ERR然後 WScript.Echo 」錯誤#「 & Err.Number的 WScript.Echo Err.Description WScript.Quit 1 End If

  2. 查找此錯誤代碼。例如,它是「拒絕訪問」還是其他一些錯誤?

  3. 創建一個C#可執行文件來調用您的對象並查看它是否可以成功創建它。

  4. 請確保您的DLL沒有任何其他的依賴性阻止它被加載到腳本運行的目錄中。您可以使用來自運行腳本的目錄中的depends.exe,也可以使用我最喜歡的窮人的regsvr32技術嘗試加載DLL。如果由於依賴關係DLL無法加載,您將得到一個錯誤對話框,告訴您無法找到另一個DLL或加載其某個依賴關係。如果它可以加載DLL,那麼它會說它成功註冊了它。

    C:\ PathToVbs> REGSVR32 C:\ PathToYourDLL \ YourDLL.dll

+0

更新 - 我發現我的問題 - 儘管進行了雙重和三重檢查,我拼錯了公司名稱,所以原始ProcMon跟蹤是正確的 - 名稱未找到。 – Mike 2012-03-08 19:35:30