2013-02-28 35 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