【发布时间】:2017-05-25 09:02:39
【问题描述】:
我有一个 c++ 函数,我使用 pinInvoke 从 c# 调用它。以下是我的 cpp 方法-
int test(DWORD verb,DWORD verb2 )
{
return verb2 *100;
}
我的功能暴露为 -
extern "C" {
__declspec(dllexport) int test(DWORD verb, DWORD verb2);
}
以下是我调用上述方法的 c# 代码:
public class API
{
[DllImport("mydll.dll", EntryPoint = "test", SetLastError = true, CallingConvention = CallingConvention.Cdecl)]
[return: MarshalAs(UnmanagedType.U4)]
public static extern uint test(
[MarshalAs(UnmanagedType.U8)]ulong verb,
[MarshalAs(UnmanagedType.U8)]ulong verb2);
static void Main(string[] args)
{
uint x = DPAPI.test(26,10);
Console.Write("result is-"+x);
}
}
这里第二个值被传递为 0,所以会出现错误的结果。传递值时我做错了什么吗?
我尝试过的:
我对 Pinvoke 比较陌生。所以我尝试调试看看值是否没有传递给c++代码或者c++代码是否没有返回正确的值。我发现传递的值本身是错误的。
【问题讨论】:
-
这个链接可以帮助你:stackoverflow.com/questions/39951473/…
-
我不认为它的类型是这里的问题,因为第一个值被正确传递。
-
@SomeshDhal 好吧,鉴于您使用的类型在内存方面是您应该使用的类型的两倍,这肯定没有帮助。
-
值在堆栈上传递。该函数接收两个 32 位值。所以它从堆栈中取出 64 位。这意味着它将您传递的第一个 64 位值解释为两个单独的 32 位值。如果您在启用堆栈不平衡 MDA 的情况下运行,您将收到有关堆栈不平衡的警告。