[英]Second value not getting passed to C++ function during pinvoke
我有一个使用pinInvoke从c#调用的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 ++代码是否未返回正确的值。我发现传递的值本身是错误的。
DWORD
是一个32但无符号的整数。 您正在将其映射到64位类型。 那就是问题所在。 您的p / invoke应为:
[DllImport("mydll.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern int test(uint verb, uint verb2);
请注意,我从DllImport
属性中删除了不必要的EntryPoint
和错误的SetLastError
。
我也想知道为什么您选择了DWORD
。 除非将这些值传递给Win32函数,否则使用固有类型可能更有意义。 为什么不在C ++代码中使用int
或unsigned int
?
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.