` 我尝试了下面的脚本来调用函数 MyFunction(LPINT, LPSTR,LPINT)
Add-Type -TypeDefinition @"
using System;
using System.Runtime.InteropServices;
public class CFunctions {
[DllImport("D:\\Test\\MySample.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern int MyFunction(IntPtr a , string data , IntPtr b);
}
"@
# Below is the Function call to "MyFunction"
$x = 21
$data_string = "Hello"
$y = 0
$result = [CFunctions]::MyFunction($x,$data_string, $y)
Write-Output "MyFunction return: $result"`
我相信 [CFunctions]:: MyFunction($x,$data_string, $y) 接受 x 和 y 的值而不是它们的地址。`
函数“MyFunction”接受第一个和第三个参数作为 LPINT。如何在下面的函数调用中传递x和y的地址?
[CFunctions]::MyFunction($x,$data_string, $y)
要表示变量
x
和 y
的指针,您可以使用 IntPtr
喜欢:$xPtr = [System.IntPtr]::Zero
然后为指针分配内存。 你可以使用
Marshal.AllocHGlobal
$xPtr = [System.Runtime.InteropServices.Marshal]::AllocHGlobal([System.Runtime.InteropServices.Marshal]::SizeOf([int]))
要将值写入
x
,请使用:Marshal.WriteInt32
[System.Runtime.InteropServices.Marshal]::WriteInt32($xPtr, $x)
然后调用该函数
$result = [CFunctions]::MyFunction($xPtr, $data_string, $yPtr)
调用函数后我们需要清除指针中分配的内存空间
$xPtr
[System.Runtime.InteropServices.Marshal]::FreeHGlobal($xPtr)