2014-02-07 5 views
0

У меня есть следующий кодСмешение управляемым и неуправляемым кодом проблема

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); 

Это призыв к 3 я предполагаю, что ошибка связана с кодом, который не имеет отношения к неуправляемому коду правильно, но я не уверен, где. Может ли кто-нибудь указать мне в правильном направлении.

ответ

1

Я не знаю, что ErrorToString ожидает в качестве аргументов, но я бы сказал, что это char *, представляющий указатель на буфер, где он может хранить результирующую строку.

В этом случае ваш код:

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

выглядит так (он выделяет один символ).

Попробуйте изменить его:

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

и посмотреть, если это работает (в данном случае, не забывайте, что вы должны освободить память позже).

Надеюсь, это поможет.

+0

Спасибо, что на самом деле поможет, но не исправит проблему, я подумал, что при использовании только нового символа он создаст необходимый размер. Во всяком случае, к сожалению, у меня все еще есть ошибка. Я нашел работу вокруг стороннего оборудования на самом деле поставляется с .net-оболочкой, поэтому все хорошо теперь благодарит. – codem

+1

Еще лучше: 'char errorCode [1024];' Избегать динамического распределения, когда это не нужно. –

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. Но вообще не было никаких причин для динамического распределения.

Смежные вопросы