【问题标题】:C# P-Invoke:how to convert INT fun( BYTE *bStream, UINT16 *nCount, const UINT8 nblk ) to C#?C# P-Invoke:如何将 INT fun( BYTE *bStream, UINT16 *nCount, const UINT8 nblk ) 转换为 C#?
【发布时间】:2013-05-22 05:19:00
【问题描述】:

用 C/C++ DLL SDK 的乐趣,像这样:

    INT CmdGetAllLog( BYTE *bStream, UINT16 *nCount, const UINT8 nblk )

但在项目中使用 c#,我这样做:

    [DllImport("C:\\PrBioApi.dll", EntryPoint = "CmdGetAllLog")]
    private static extern bool CmdGetAllLog(IntPtr bStream, ref UInt16 nCount, byte nblk);

我将它用于:

                    int nMallocSize = Marshal.SizeOf(new LOG_RECORD()) * stuSystem.wLogCnt + 4096;
                    byte[] pRecord = new byte[nMallocSize];
                    IntPtr p = Marshal.AllocHGlobal(Marshal.SizeOf(nMallocSize));
                    Marshal.Copy(pRecord, 0, p, pRecord.Length);

                    bGetSucc = CmdGetAllLog(p, ref nGet, nBlk++);

                    Marshal.FreeHGlobal(p);

但它不起作用。 有人可以帮助我吗?谢谢。

【问题讨论】:

    标签: c# c++ winapi pinvoke


    【解决方案1】:

    在托管数组和非托管指针之间复制的代码位于错误的位置。它需要在调用非托管函数之后。

    但您也可以让 p/invoke marshaller 为您完成工作:

    [DllImport(@"C:\PrBioApi.dll")]
    private static extern bool CmdGetAllLog(
        byte[] bStream, 
        ref ushort nCount, 
        byte nblk
    );
    
    int nMallocSize = ...;
    byte[] pRecord = new byte[nMallocSize];
    bool bGetSucc = CmdGetAllLog(pRecord, ref nGet, nBlk++);
    

    因为字节数组是 blittable,所以编组器将在调用期间固定您的数组并将其交给本机代码。

    我假设其他两个参数已正确传递。由于您没有指定界面的更多详细信息,因此它们很可能是错误的。我猜nGet 用于告诉函数缓冲区有多大,并返回函数复制了多少。我看不到您在问题中指定nGet 的位置。我相信你说得对。

    其他一些cmets:

    1. 您可能需要在DllImport 属性中指定调用约定。可能是原生代码cdecl
    2. 本机代码中的返回值为INT,但您已将其映射到bool。如果协议是非零返回意味着成功,那可能很好。但是,如果返回值表明的不止于此,那么您显然需要使用int。就我个人而言,我倾向于使用int 并忠于本机。

    【讨论】:

    • 是的,删除“ref”时它可以工作。3Q。但是有一个小问题。
    • 事实上,我们会像这样使用C/C++: bGetSucc = CmdGetAllLog((BYTE*) (pRecord+nGetCount), &nGet, nBlk++);但是我不知道如何在 C# 中使用“+”。这段代码应该在一段时间内。
    • 这是一个不同的问题,有不同的答案。您需要在问题中提供更多详细信息。在 cmets 中泄漏它没有好处。
    猜你喜欢
    • 2020-02-03
    • 1970-01-01
    • 2015-07-16
    • 2022-07-21
    • 1970-01-01
    • 1970-01-01
    • 2019-03-07
    • 1970-01-01
    • 2017-11-05
    相关资源
    最近更新 更多