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

问题描述 投票:0回答:1

我是C#的新手,我已经构建了一个包含来自制造商的C ++ DLL的ProcessData类(我无法访问此DLL中的代码)。 C ++ DLL的一个方法是将一个指针(void far *)返回到我的硬盘驱动器上的HandleFile.xyz,但我不知道该文件的内容。另一种重用此指针的方法可以处理我的数据,如下面的代码所示。

    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来处理我的数据,它们使用不同的ProcessData对象连续加载一个foreach循环。每个ProcessData对象仅包含指向相应HandleFileX.xyz的指针。

循环的第一次迭代进展顺利,但第二次迭代在dWorkWithFile(currentFile, mydata)上崩溃,返回以下错误:

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

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

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

什么可能导致这个问题的任何其他想法?

c# c++ pointers marshalling
1个回答
0
投票

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

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

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

感谢jdweng的建议!

© www.soinside.com 2019 - 2024. All rights reserved.