繁体   English   中英

Pinvoke期间第二个值未传递到C ++函数

[英]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 ++代码中使用intunsigned int

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM