• λ我爱Aspx >> Asp.Net >> 在 C# 中通过 P/Invoke 调用Win32 DLL
  • 在 C# 中通过 P/Invoke 调用Win32 DLL

  • :未知  Դ:internet  :2007-5-20 16:49:09  ؼ:c#
  • void TakesAPointer(DWORD* pNum);

    可以看到,上述函数的唯一一个参数是指向 DWORD 变量的指针。

    当通过 P/Invoke 封送指针时,ref 和 out 只用于托管代码中的值类型。当一个参数的 CLR 类型使用 struct 关键字定义时,可以认为该参数是一个值类型。Out 和 ref 用于封送指向这些数据类型的指针,因为通常值类型变量是对象或数据,而在托管代码中并没有对值类型的引用。相反,当封送引用类型对象时,并不需要 ref 和 out 关键字,因为变量已经是对象的引用了。

    如果您对引用类型和值类型之间的差别不是很熟悉,请查阅 2000 年 12 月 发行的 MSDN® Magazine,在 .NET 专栏的主题中可以找到更多信息。大多数 CLR 类型都是引用类型;然而,除了 System.String 和 System.Object,所有的基元类型(例如 System.Int32 和 System.Boolean)都是值类型。

    封送不透明 (Opaque) 指针:一种特殊情况

    有时在 Windows API 中,方法传递或返回的指针是不透明的,这意味着该指针值从技术角度讲是一个指针,但代码却不直接使用它。相反,代码将该指针返回给 Windows 以便随后进行重用。

    一个非常常见的例子就是句柄的概念。在 Windows 中,内部数据结构(从文件到屏幕上的按钮)在应用程序代码中都表示为句柄。句柄其实就是不透明的指针或有着指针宽度的数值,应用程序用它来表示内部的 OS 构造。

    少数情况下,API 函数也将不透明指针定义为 PVOID 或 LPVOID 类型。在 Windows API 的定义中,这些类型意思就是说该指针没有类型。

    当一个不透明指针返回给您的应用程序(或者您的应用程序期望得到一个不透明指针)时,您应该将参数或返回值封送为 CLR 中的一种特殊类型 — System.IntPtr。当您使用 IntPtr 类型时,通常不使用 out 或 ref 参数,因为 IntPtr 意为直接持有指针。不过,如果您将一个指针封送为一个指针,则对 IntPtr 使用 by-ref 参数是合适的。

    Ҷƪл˵?
  • һƪ防止对 Visual Basic .NET 或 C# 代码进行反相工程
    һƪC# 泛型简介