混合托管和不受管理的代码问题



我有以下代码

    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:Windowssystem32en-USerofflps.txt

我知道它是由以下行引起的

ErrorToString(lngErrorcode, errorcode);

这是对第三方代码的调用,我认为错误与未正确处理未正确代码的代码有关,但我不确定在哪里。有人可以向我指出正确的方向吗?

我不知道erortostring的期望是参数,但我会说这是一个char*代表可以存储结果字符串的指针。

在这种情况下,您的代码:

//Obtain error string
char* errorcode = new char;
ErrorToString(lngErrorcode, errorcode);

看起来错(正在分配一个字符)。

尝试将其更改为:

//Obtain error string
char* errorcode = new char[1024];
ErrorToString(lngErrorcode, errorcode);

看看这是否有效(在这种情况下,不要忘记您需要稍后发布内存)。

希望这会有所帮助。

您正在使所有这一切太复杂。而不是

    //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。但是根本没有理由进行任何动态分配。

相关内容

  • 没有找到相关文章

最新更新