pinvoke 期间未将第二个值传递给 C++ 函数
Second value not getting passed to C++ function during pinvoke
我有一个 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++ 代码是否未正确返回 values.I 发现传递的值本身是错误的。
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
?
我有一个 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++ 代码是否未正确返回 values.I 发现传递的值本身是错误的。
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
?