平台调用技术示例
更新:2007 年 11 月
本示例演示了调用从非托管库中导出的函数的技术。它展示了如何:
声明不同的类型
使用可用属性修改默认行为
使用 Marshal 类型的方法
确定垃圾回收和线程处理的哪些方面会影响结果。
有些示例使用从 Windows 库中导出的函数,而有些示例使用从自定义库中导出的函数。某些示例使用在所有 Windows 平台上都不可用的库,或以所有 Windows 平台都不支持的方法使用函数。但是,这并不妨碍您理解示例中使用的特定平台调用规则。
这些示例包含以下目录结构:
目录 |
内容 |
---|---|
WinAPIs |
使用从 Windows 库中导出的函数演示的平台调用 |
WinAPIs\CS |
用 C# 编写的源代码 |
WinAPIs\VB |
用 Visual Basic 编写的源代码 |
Custom |
使用从自定义类型库中导出的函数说明的平台调用。 |
Custom\CS |
用 C# 编写的源代码 |
Custom\LIB |
自定义类型库源代码 |
Custom\VB |
用 VB 编写的源代码 |
有关使用这些示例的信息,请参见下面的主题:
使用命令提示生成示例
打开命令提示窗口,然后定位到语言特定子目录之一。
在命令行上键入 msbuild [文件名].sln。
说明: Custom 平台调用示例只能使用 Visual Studio 生成。
使用 Visual Studio 生成示例
打开 Windows 资源管理器,然后定位到语言特定子目录之一。
双击 [文件名].sln 的图标以在 Visual Studio 中打开该文件。
在“生成”菜单中选择“生成解决方案”。
运行示例
定位到 WinAPIs 或 Custom 目录下包含生成的可执行文件的语言特定目录之一。
在命令行上键入可执行文件的名称。
说明: 此示例生成控制台应用程序。您必须在命令提示窗口中分别启动它们才能查看它们的输出。
要求
如果您使用 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 |
有关平台调用的更多信息,请参见源代码文件中的注释。