我有以下代码
System::Void MainForm::initLoadCell(){
//Open the first found LabJack U3 over USB.
lngErrorcode = OpenLabJack (LJ_dtU3, LJ_ctUSB, "1", TRUE, &lngHandle);
//Load defualt config
lngErrorcode = ePut (lngHandle, LJ_ioPIN_CONFIGURATION_RESET, 0, 0, 0);
//Setup FIO0 as an analogue input port
lngErrorcode = ePut (lngHandle, LJ_ioPUT_ANALOG_ENABLE_BIT,0,1,0);
//Obtain error string
char* errorcode = new char;
ErrorToString(lngErrorcode, errorcode);
// Convert the c string to a managed String.
String ^ errorString = Marshal::PtrToStringAnsi((IntPtr) (char *) errorcode);
MainForm::textBox_LoadCellError->Text = errorString;
Marshal::FreeHGlobal((IntPtr)errorcode);
}
当我直接从Visual Studio运行程序但是当我构建.exe文件并以独立方式运行时,这会产生以下错误
Problem signature:
Problem Event Name: APPCRASH
Application Name: BenchTester.exe
Application Version: 0.0.0.0
Application Timestamp: 52f4c0dd
Fault Module Name: ntdll.dll
Fault Module Version: 6.1.7601.18247
Fault Module Timestamp: 521ea8e7
Exception Code: c0000005
Exception Offset: 0002e3be
OS Version: 6.1.7601.2.1.0.256.1
Locale ID: 3081
Additional Information 1: 0a9e
Additional Information 2: 0a9e372d3b4ad19135b953a78882e789
Additional Information 3: 0a9e
Additional Information 4: 0a9e372d3b4ad19135b953a78882e789
Read our privacy statement online:
http://go.microsoft.com/fwlink/?linkid=104288&clcid=0x0409
If the online privacy statement is not available, please read our privacy statement offline:
C:\Windows\system32\en-US\erofflps.txt
我知道它是由以下行引起的
ErrorToString(lngErrorcode, errorcode);
这是对第三方代码的调用,我假设错误与代码没有正确处理非托管代码有关,但我不确定在哪里。有人可以指出我正确的方向。
答案 0 :(得分:1)
我不知道ErrorToString期望什么作为参数,但我会说它是一个char *,表示指向缓冲区的指针,它可以存储结果字符串。
在这种情况下你的代码:
//Obtain error string
char* errorcode = new char;
ErrorToString(lngErrorcode, errorcode);
看起来不对(它正在分配一个字符)。
尝试将其更改为:
//Obtain error string
char* errorcode = new char[1024];
ErrorToString(lngErrorcode, errorcode);
并查看是否有效(在这种情况下,不要忘记您需要稍后释放内存)。
希望这有帮助。
答案 1 :(得分:0)
你所做的一切都太复杂了。而不是
//Obtain error string
char* errorcode = new char;
ErrorToString(lngErrorcode, errorcode);
// Convert the c string to a managed String.
String ^ errorString = Marshal::PtrToStringAnsi((IntPtr) (char *) errorcode);
MainForm::textBox_LoadCellError->Text = errorString;
Marshal::FreeHGlobal((IntPtr)errorcode);
您只需要:
//Obtain error string
char errorString[1024];
ErrorToString(lngErrorcode, errorString);
MainForm::textBox_LoadCellError->Text = gcnew System::String(errorString);
您最初有两个问题:没有足够大的缓冲区,以及不匹配的分配和释放功能。使用new
后,您必须使用delete
,而不是Marshal::FreeHGlobal
。但根本没有理由进行任何动态分配。