1

少し前にここで質問しました。.NETからの従来のC++プログラムの呼び出しに関する COMと非COMDLLです。

(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
4

2 に答える 2

4

WINAPI 呼び出しに関する既存のラッパー クラスは、System.Windows名前空間と呼ばれます。;-)

于 2013-02-28T19:03:02.847 に答える
2

あなたの他の質問に対するハンスのコメントは次のように述べています。

.NET プログラムでクラスをエクスポートする C++ DLL を直接使用することはできません。C++/CLI 言語で記述されたラッパーが必要です。

彼が言ったように、その状況でラッパーが必要だった理由は、C++ によってエクスポートされたクラスを .NET が使用できないためです。ただし、この場合、関数はクラスではなく、C++ からコンパイルされた DLL によってエクスポートされたMessageBox単なる関数です。あなたが示したように、VB.NET は非常に簡単に API 関数を呼び出すために使用できます。問題は API関数の呼び出しではありません。問題は、C++ クラスの使用にあります。

ただし、他の人が言ったように、この場合、 managed を使用したいだけですMessageBox.Show

于 2013-02-28T19:16:18.547 に答える