我对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);
是初始化我的指针的正确方法还是应该使用编组,如果是,如何?你能举个例子吗?
还有其他想法可能导致此问题吗?
答案 0 :(得分:0)
好吧,如果有人遇到此问题,则需要在foreach循环中的每次迭代后使用UnFileLoad方法卸载.xyz文件。
public void UnLoadFile(IntPtr currentFileHandle)
{
uint = dUnLoadFile(currentFileHandle);
}
这就是我在处理ProcessData对象时所做的事情。但是,我也有一种方法来初始化ProcessData对象,并且那里没有卸载文件。我可以毫无问题地初始化我的所有对象(这很奇怪),但是程序开始处理时崩溃了。
感谢jdweng的建议!