如何处理从C#中的C ++ DLL返回的IntPtr?

时间:2019-02-28 22:32:08

标签: c# c++ pointers marshalling

我对C#还是很陌生,我建立了一个ProcessData类,该类包装了制造商提供的C ++ DLL(我无法访问此DLL中的代码)。 C ++ DLL的方法之一返回了指向我硬盘上的HandleFile.xyz的指针(void far *),但是我不知道该文件的内容。再次使用此指针的另一种方法可以处理我的数据,如下面的代码所示。

    public class ProcessData
{

    [DllImport("myfile.dll", EntryPoint = "LoadFile", SetLastError = true, CharSet = CharSet.None)]
    public static extern IntPtr dLoadFile(string filePath);

    [DllImport("myfile.dll", EntryPoint = "WorkWithFile", SetLastError = true, CharSet = CharSet.None)]
    public static extern uint dWorkWithFile(IntPtr fileHandle, int mydata);

    public IntPtr currentFileHandle; 

    public void LoadFile(string filePath)
    {
    currentFileHandle = dLoadFile(filePath);
    }

    public uint WorkWithFile(int mydata)
    {
    uint x = dWorkWithFile(currentFileHandle, mydata);
    return x;
    }
}

如果我在加载单个HandleFile.xyz时尝试了此操作,则一切正常,并且WorkWithFile返回的值很有意义。

当我尝试在另一个类中使用ProcessData作为List时,问题就来了,因为最后,我需要使用多个不同的HandleFile1.xyz,HandleFile2.xyz,HandleFile3.xyz处理数据,然后使用不同的顺序加载foreach循环中的ProcessData对象。每个ProcessData对象仅包含指向相应HandleFileX.xyz的指针。

循环的第一次迭代进行得很好,但是第二次迭代在dWorkWithFile(currentFile, mydata)上崩溃,返回了以下错误:

  

在MyProgram.exe中的0x07DE4C2A(myfile.dll)处引发了异常:   0xC0000005:访问冲突读取位置0x00000000。

我怀疑这可能与创建ProcessData对象时初始化指针的方式有关,因为本文可能会建议:https://stackoverflow.com/a/10479020/8298327

currentFileHandle = dLoadFile(filePath);是初始化我的指针的正确方法还是应该使用编组,如果是,如何?你能举个例子吗?

还有其他想法可能导致此问题吗?

1 个答案:

答案 0 :(得分:0)

好吧,如果有人遇到此问题,则需要在foreach循环中的每次迭代后使用UnFileLoad方法卸载.xyz文件。

public void UnLoadFile(IntPtr currentFileHandle)
{
uint = dUnLoadFile(currentFileHandle);
}

这就是我在处理ProcessData对象时所做的事情。但是,我也有一种方法来初始化ProcessData对象,并且那里没有卸载文件。我可以毫无问题地初始化我的所有对象(这很奇怪),但是程序开始处理时崩溃了。

感谢jdweng的建议!