2012-01-28 28 views
1

我嘗試爲DirectShow註冊一個自定義過濾器,但windows不會正確註冊它。regsvr32.exe用hInstance拋出ASSERT_ERROR

當我運行一個「無法認定」框中顯示出來告訴我:

g_hInst is NULL at Line 388 in file "dllsetup.cpp" 

該文件位於Microft SKD目錄通常樣品中.. \ DSHOW \基類目錄。當按下「是」時,regsvr32.exe會成功返回。

我用註冊表檢查了註冊表項,InProcServer32 的文件路徑設置爲 regsvr32.exe本身的目錄。 (這證實了缺少的HINSTANCE)。 DllRegisterServer需要一個有效的DLL實例,但不能得到它......但爲什麼?

我,因爲這個錯誤進入註冊表全部過濾器不能被添加到任何過濾器圖形卡(錯誤信息:錯誤的DLL - >這意味着它調用regsvr32.exe的「發現過濾器」)

回答

1

From include/BaseClasses/dllsetup.cpp:

// g_hInst handle is set in our dll entry point. Make sure 
// DllEntryPoint in dllentry.cpp is called 
ASSERT(g_hInst != 0); 

不是很多可能的失敗模式,註釋非常明確。你可能只是忘了在你的DllMain()函數中調用DllEntryPoint()。只要regsvr32.exe加載DLL,就會調用它。如有疑問,請使用調試器。項目+屬性,調試,將命令設置爲c:\ windows \ system32 \ regsvr32.exe並在您的DllMain()函數上設置一個斷點。按F5。

+0

我仍然是一個新手直接顯示過濾器,但我必須爆炸性地實現一個DllMain功能?我認爲DirectShow自己處理「DllMain,DllCanUnloadNow,DllGetClassObject」,我只需要在.def文件中定義它們。 – BeschBesch 2012-01-29 12:20:36

+0

通過調用DllEntryPoint並在閱讀DShow過濾器上的MSDN文檔後重置我的項目設置來解決問題 - > [link](http://msdn.microsoft.com/zh-cn/library/windows/desktop/dd391013%28v= vs.85%29.aspx)。 **有同樣的問題???:看看這個網站:[鏈接](http://msdn.microsoft.com/en-us/library/windows/desktop/dd318238%28v=vs.85%29.aspx )** – BeschBesch 2012-01-29 14:41:35

+0

有趣的是,該鏈接顯然與http://msdn.microsoft.com/en-us/library/windows/desktop/dd375485(v=vs.85).aspx上的信息矛盾,這表明(a)存在沒有必要實現一個DllMain作爲基類提供一個(雖然它談到它使用不同的名稱,但沒有描述這是如何工作的)和(b)dll入口函數(即DllMain)不應該導出,MS需要把它們的文檔放在一起... – Jules 2013-04-14 14:45:08

相關問題