如何使用PowerShell脚本加载和调用C++ DLL的函数Myfunction,其接受参数为(LPINT,LPSTR,LPINT)

问题描述 投票:0回答:1

` 我尝试了下面的脚本来调用函数 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)

c# powershell winapi mfc
1个回答
-1
投票

要表示变量

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)

© www.soinside.com 2019 - 2024. All rights reserved.