2012-10-11 30 views
1

讓我首先說我不知道​​我現在不知道什麼,所以而不是具體的答案,我還在尋找更好的問題, 我認爲。我的.Net/C#已經足夠穩固,而我的C/C++就是meh。最近,我發現標準.Net框架中沒有庫來完成某些任務,雖然它很容易下載第三方庫,但我想了解如何自己做到這一點一個不存在。爲Windows API和COM DLL創建.Net包裝器

在最近的一個案例中,我需要在相對較低級別的Windows中處理MIDI,並且我意外地發現「winmm.dll」是我需要通過下載.net包裝器用於MIDI和通過源瀏覽。我明白,我將不得不做一個包裝類,並做整個P/Invoke的事情,使之發生。

接下來我做的是在Windows API上搜索文檔以找出「winmm.dll」的神祕盒中發生了什麼,令我高興的是,有一個完整的Windows SDK,我是能夠下載並通讀。我瀏覽了「Windows開發」的「入門」部分,其中介紹了一些基於C++的基礎知識。它談論了一些關於COM,Windows頭文件,並且我知道足夠多的C++來獲得要點。

現在,我需要的幾個問題點與點之間的幫助:

1)在Windows SDK,到目前爲止,似乎表明,我要進行編程,以特定的頭文件,而不是DLL文件本身,而是我通常發現.NET包裝指向特定爲.dll,而頭文件中...

/// <summary> 
/// Returns the number of MIDI input devices on this system. 
/// </summary> 
/// Win32 docs: http://msdn.microsoft.com/en-us/library/ms711608(VS.85).aspx 
[DllImport("winmm.dll", SetLastError = true)] 
public static extern UInt32 midiInGetNumDevs(); 

我的印象是,一個頭文件和DLL需要在同一個文件夾中,但Windows SDK包含一個包含所有Windows頭文件的文件夾,並且不包含任何DLL(我猜註冊表在這裏用於映射到特定的庫?)?這些頭文件如何最終映射到實際庫,以及爲什麼看起來我甚至不需要處理頭文件來創建.Net包裝? 2)我似乎無法找到有關winmm.dll的文檔,但我已經找到了在Windows SDK中的「Windows API」列表中可能需要的函數的參考,並且我很確定那些函數的代碼在winmm.dll中。如何找到我需要開始創建包裝的特定庫的文檔?如果我不知道我將需要winmm.dll來訪問Windows MIDI功能,那麼我怎麼能想出自己的?

3)某些DLLs是COM,有些是純windows dll,有些是.net dll ...我怎麼能告訴不同的前進?看起來,爲前兩者創建包裝需要採用不同的方法。

4)MSDN上沒有關於列出其所有API的「Winmm.dll」的頁面,我認爲這有一個很好的和實際的原因,但我不確定它是什麼?我已經習慣了.NET網站,在那裏我可以弄清楚圖書館的功能以及幾乎毫不費力地使用它的方式。

在此先感謝您的任何見解。

回答

1

1)在Windows API文檔包括頭部,庫,和每個方法/枚舉/等DLL文件。當我閱讀並注意到這一點時,我只是沒有向下滾動。頭文件不一定必須與dll位於同一目錄中;它的內容只需在編譯程序時複製/粘貼到.c文件中即可。我在這裏失蹤的部分是我閱讀的彙編鏈接階段here

2)文檔在那裏 - 我只是不得不尋找它有點困難。

3)How can I detect the type of a dll? (COM, .NET, WIN32)

4)音頻理論上可以跨越多個DLL文件,因此最好的行動過程中的API是找到API文檔,找到你想包裝方法,然後找出DLL的那些方法在,然後導入每個這些DLL。

2

在此聖經是亞當納森優秀的書「.Net和COM的完全的互操作性指南」

包括PInvoke的和幾個音頻型實例