回答
它基本上調用你的dll(在這種情況下命名爲filename.ax)並調用它的「DllRegisterServer」方法。
對於directshow過濾器,它可能會在windows註冊表中註冊這些過濾器,以便directshow知道它們。
例如:雖然有更爲簡單的版本在那裏https://github.com/rdp/directshow-demo-audio-input-open-source/blob/master/acam/virt_audio_all.cpp#L698調用 https://github.com/rdp/directshow-demo-audio-input-open-source/blob/master/acam/virt_audio_all.cpp#L631
。
regsvr32將DLL和EXE註冊到Windows註冊表中(通常是COM類型庫,類ID,接口ID等)。您可以使用regedit來導航註冊表。
但它是如何工作的?它有什麼樣的影響? – wamp 2010-08-13 09:16:10
COM即在Windows中廣泛使用依賴註冊。一個組件將提供類型庫,接口和類。其中每個都由一個GUID定義,以唯一地命名它們。 COM組件還可以定義ProgID,它們是笨重的GUID的快捷方式。
所有這些信息都存儲在名爲HKEY_CLASSES_ROOT
的計算機上的特殊註冊表配置單元中。使用RegEdit.exe
來查看它。特別是您可以在HKEY_CLASSES_ROOT\TypeLib
中找到類型庫,HKEY_CLASSES_ROOT\Interface
中的接口和HKEY_CLASSES_ROOT\CLSID
中的類。註冊表中的某些信息將包含組件的實際DLL的路徑,允許Windows在請求時查找和加載組件。
當您安裝COM組件時,需要創建正確的註冊表信息。按照慣例,DLL可以提供兩種輸出功能:
當您執行RegSvr32.exe MyComponent.dll
的RegSvr32.exe
可執行文件將嘗試調用DllRegisterServer
在MyComponent.dll
。然後該DLL應該創建所有必要的註冊表項以允許使用該組件。
以類似的方式,您可以使用RegSvr32.exe /u MyComponent.dll
取消註冊組件。這將刪除以前添加到註冊表中的所有信息。
Windows很大程度上依賴於COM,COM註冊是最新的非常重要。不幸的是,沒有任何東西阻止您刪除已經註冊的COM組件。這將使註冊表中的懸掛指針指向不再存在的DLL。你甚至不能註銷它,因爲它不再存在。
另一個問題是當兩個不同的應用程序需要不同版本的相同組件時。註冊表只能指向兩個版本中的一個,這可能會導致其中一個應用程序失敗。
Microsoft已爲這些問題創建了修復程序。爲COM組件提供安裝程序要好得多,它可以在組件已被刪除的情況下進行修復和卸載。您還可以在不同版本中創建相同組件的並行安裝。
非常高質量的答案,謝謝 – AFract 2016-08-30 09:21:29
- 1. gwt PlaceTokenizer實際上做了什麼?
- 2. Arduino F():它實際上做了什麼
- 3. numpy.cov實際上做了什麼
- 4. ADMManifest.checkManifestAuthoredProperly()實際上做了什麼?
- 5. LD_INCLUDE_PATH實際上做了什麼嗎?
- 6. android:stretchMode實際上做了什麼?
- 7. CascadeType.REFRESH實際上做了什麼?
- 8. session_register_shutdown實際上做了什麼?
- 9. CloudQueue.EndAddMessage(IAsyncResult)實際上做了什麼?
- 10. Int [] Reverse - 這實際上做了什麼?
- 11. e.preventDefault()方法實際上做了什麼?
- 12. Python的__file__實際上做了什麼?
- 13. std :: ofstream :: close()實際上做了什麼?
- 14. XCode'Clean'實際上做了什麼?
- 15. 實際上做了什麼glutswapbuffers?
- 16. Sinatra :: Base.condition實際上做了什麼?
- 17. NSLog實際上做了什麼?
- 18. SetPriorityClass(REALTIME_PRIORITY_CLASS)實際上做了什麼?
- 19. TwoPassFilter GPUImage實際上做了什麼?
- 20. terraform刷新實際上做了什麼?
- 21. SpringClassRule/SpringMethodRule實際上做了什麼?
- 22. IMetadataExchange端點實際上做了什麼?
- 23. Android SQLite - SQLiteDatabase.replace()實際上做了什麼?
- 24. MvcBuildViews實際上做了什麼嗎?
- 25. pdb文件實際上做了什麼?
- 26. BlockingCollection.Dispose實際上做了什麼?
- 27. ld -m --verbose實際上做了什麼?
- 28. ifstream :: rdbuf()實際上做了什麼?
- 29. TortoiseSVN清理實際上做了什麼?
- 30. Process.Dispose()實際上做了什麼?
這兩個github鏈接都不再起作用 - 你能夠編輯你的答案中的例子嗎? – codingbadger 2011-11-12 09:57:48
對此表示遺憾 – rogerdpack 2011-11-22 14:12:40