2013-02-28 29 views
1

前段時間我在這裏問了一個問題:COM vs non-COM DLL關於從.NET調用經典的C++程序。在.NET中使用Windows API函數

答案(來自Hans Passant)是在Visual C++中編寫了一個包裝類,在我的項目中工作得很好(我從另一個更熟悉C++的開發人員那裏獲得了一些幫助)。

我的問題是:是否有包裝類爲WINAPI中的一些功能創建。例如,下面的代碼工作沒有一個包裝類:

Imports System.Runtime.InteropServices 
Imports System.Text 

Public Class Form1 

    <DllImport("user32.dll", SetLastError:=True, CharSet:=CharSet.Ansi)> _ 
    Public Shared Function MessageBox(ByVal hwnd As IntPtr, <MarshalAs(UnmanagedType.LPStr)> ByVal lpString As String, <MarshalAs(UnmanagedType.LPStr)> ByVal lpString2 As String, ByVal cch As Integer) As Integer 
    End Function 

    Private Sub Form1_Load(ByVal sender As Object, ByVal e As System.EventArgs) Handles Me.Load 
     MessageBox(0, "HelloWorld", "HelloWorld", 0) 
    End Sub 
End Class 
+0

這就是['MessageBox.Show'](http://msdn.microsoft.com/en-us/library/system.windows.forms.messagebox.show.aspx) – 2013-02-28 19:07:20

回答

2

漢斯對你的另一個問題評論說:

不能直接使用C++動態鏈接庫導出在.NET程序類。需要用C++/CLI語言編寫的包裝器。

正如他所說的,究其原因,在這種情況下,爲什麼需要一個包裝是因爲.NET不能使用由C++出口。然而,在這種情況下,MessageBox函數只是一個函數,它是由C++編譯的DLL導出的,而不是。正如您已經演示的那樣,VB.NET可以非常方便地用於調用API函數。問題不在調用API 函數。問題在於使用C++類。

正如其他人所說,雖然在這種情況下,您只是想使用託管MessageBox.Show

+0

感謝+1澄清這一點。這就是爲什麼你只能引用使用DLLIMPORT的共享成員?我會一直使用MessageBox.Show。我問這個問題的原因是要學習。 – w0051977 2013-02-28 19:23:54

+0

我完全不熟悉C++中的Windows編程,但是從我所知道的,是的。你當然不能導入類的實例方法,因爲這樣做首先需要實例化該類型的對象。 – 2013-02-28 19:27:02

+0

C++是一種面向對象的編程語言。爲什麼不能創建一個類的實例而不創建一個包裝? – w0051977 2013-02-28 23:00:09

4

各地WINAPI調用現有的包裝類被稱爲System.Windows命名空間。 ;-)

+0

謝謝。 +1爲MSDN參考。 – w0051977 2013-02-28 19:23:03