平台调用技术示例

更新:2007 年 11 月

本示例演示了调用从非托管库中导出的函数的技术。它展示了如何:

  • 声明不同的类型

  • 使用可用属性修改默认行为

  • 使用 Marshal 类型的方法

  • 确定垃圾回收和线程处理的哪些方面会影响结果。

有些示例使用从 Windows 库中导出的函数,而有些示例使用从自定义库中导出的函数。某些示例使用在所有 Windows 平台上都不可用的库,或以所有 Windows 平台都不支持的方法使用函数。但是,这并不妨碍您理解示例中使用的特定平台调用规则。

这些示例包含以下目录结构:

目录

内容

WinAPIs

使用从 Windows 库中导出的函数演示的平台调用

WinAPIs\CS

用 C# 编写的源代码

WinAPIs\VB

用 Visual Basic 编写的源代码

Custom

使用从自定义类型库中导出的函数说明的平台调用。

Custom\CS

用 C# 编写的源代码

Custom\LIB

自定义类型库源代码

Custom\VB

用 VB 编写的源代码

有关使用这些示例的信息,请参见下面的主题:

Download sample

使用命令提示生成示例

  1. 打开命令提示窗口,然后定位到语言特定子目录之一。

  2. 在命令行上键入 msbuild [文件名].sln。

    8bbftkst.alert_note(zh-cn,VS.90).gif说明:

    Custom 平台调用示例只能使用 Visual Studio 生成。

使用 Visual Studio 生成示例

  1. 打开 Windows 资源管理器,然后定位到语言特定子目录之一。

  2. 双击 [文件名].sln 的图标以在 Visual Studio 中打开该文件。

  3. 在“生成”菜单中选择“生成解决方案”。

运行示例

  1. 定位到 WinAPIs 或 Custom 目录下包含生成的可执行文件的语言特定目录之一。

  2. 在命令行上键入可执行文件的名称。

    8bbftkst.alert_note(zh-cn,VS.90).gif说明:

    此示例生成控制台应用程序。您必须在命令提示窗口中分别启动它们才能查看它们的输出。

要求

如果您使用 Microsoft Visual Studio 2005(“Visual Studio 2005 命令提示符”)进行生成,或者已在包含路径中安装并指定了 Platform SDK,则这些示例需要可用于您的项目的 Windows 头文件。

备注

下面各表汇总了这些示例所演示的主题,并列出与该主题相关的一个或多个示例的源文件的位置。

如何使用平台调用属性

属性

说明

示例

EntryPoint

重命名函数以在托管代码中使用。

WinAPIs\CS\MsgBox.cs WinAPIs\VB\MsgBox.vb

CharSet

选择封送字符串的方式;它还影响函数名搜索条件。

WinAPIs\CS\MsgBox.cs WinAPIs\VB\MsgBox.vb

ExactSpelling

指出是否应修改非托管 DLL 中入口点的名称以便与 CharSet 值相对应。

WinAPIs\CS\MsgBox.cs WinAPIs\VB\MsgBox.vb

CallingConvention

以 varargs 来调用函数。

WinAPIs\CS\Printf.cs WinAPIs\VB\Printf.vb

PreserveSig

修改返回 HRESULT 的函数。

WinAPIs\CS\CreateObject.cs WinAPIs\VB\CreateObject.vb

SetLastError

确保在函数调用后保存错误代码。

WinAPIs\CS\Errors.cs WinAPIs\VB\Errors.vb

如何封送结构和联合

类型

说明

示例

结构,ByVal

以 In 参数的形式传递结构。

Custom\CS\Structs.cs Custom\VB\Structs.vb

结构,ByRef

以 In/Out 参数的形式传递结构。

WinAPIs\CS\OSInfo.cs WinAPIs\VB\OSInfo.vb

类,ByVal

以 In/Out 参数的形式传递只有整数成员的类。

WinAPIs\CS\SysTime.cs WinAPIs\VB\SysTime.vb

具有嵌套结构的结构(单一化)

在非托管端生成一个类,该类表示具有嵌套结构的结构。在托管端的一个大结构中对结构进行了单一化。

WinAPIs\CS\FindFile.cs WinAPIs\VB\FindFile.vb

具有嵌套结构的结构(未单一化)

传递具有嵌入结构的结构。

Custom\CS\Structs.cs Custom\VB\Structs.vb

包含指向另一个结构的指针的结构

传递包含指向另一个结构的指针并以其作为成员的结构。

Custom\CS\Structs.cs Custom\VB\Structs.vb

只包含整数的结构数组,ByVal

传递只包含将整数作为 In/Out 参数的结构的数组。

Custom\CS\Arrays.cs Custom\VB\Arrays.vb

包含整数和字符串的结构数组,ByRef

以 Out 参数的形式传递包含整数和字符串的结构的数组。被调用方为数组分配内存。

Custom\CS\OutArrayOfStructs.cs Custom\VB\OutArrayOfStructs.vb

具有值类型的联合

传递具有值类型(整型和双精度型)的联合。

Custom\CS\Unions.cs Custom\VB\Unions.vb

具有混合类型的联合

传递具有混合类型(整型和字符串类型)的联合。

Custom\CS\Unions.cs Custom\VB\Unions.vb

如何封送数组

数组

说明

示例

整数数组,ByVal

将整数数组作为 In/Out 参数传递。

Custom\CS\Arrays.cs Custom\VB\Arrays.vb

整数数组,ByRef

将整数数组作为 In/Out 参数传递。可以调整数组的大小。

Custom\CS\Arrays.cs Custom\VB\Arrays.vb

整数二维数组,ByVal

以 In/Out 参数的形式传递整数矩阵。

Custom\CS\Arrays.cs Custom\VB\Arrays.vb

杂项

项的类型

说明

示例

HandleRef

介绍了一种需要使用 HandleRef 来防止垃圾回收的情况。

WinAPIs\CS\HandleRef.cs WinAPIs\VB\HandleRef.vb

函数指针

将委托传递给需要函数指针的非托管函数。

Custom\CS\Callback.cs Custom\VB\Callback.vb

void*

调用将 void* 作为参数的函数。

Custom\CS\Void.cs Custom\VB\Void.vb

LPARAM

使用 GCHandle 将托管对象传递给需要 LPARAM 的非托管函数。

WinAPIs\CS\GCHandle.cs WinAPIs\VB\GCHandle.vb

单线程单元 (STA)/多线程单元 (MTA)

在非托管函数调用 CoInitialize 时更改默认单元设置。

WinAPIs\CS\ActiveDir.cs WinAPIs\VB\ActiveDir.vb

有关平台调用的更多信息,请参见源代码文件中的注释。

请参见

概念

使用非托管 DLL 函数

平台调用示例

参考

CharSet

DllImportAttribute

LayoutKind

Marshal

MarshalAsAttribute

StructLayoutAttribute

其他资源

默认封送处理行为

用平台调用封送数据