2015-10-16 1 views
1

Я написал dll в visual C++, который содержит функции, которые я вызываю из labview. Я создаю указатель на инициализацию, передаю этот указатель, затем использую его при вызове других функций. Все работает нормально, пока я не попытаюсь удалить этот указатель, затем я получаю «Необработанное исключение в 0x56DC514A (intelcamera.dll) в LabVIEW.exe: 0xC000001D: Нелегальная инструкция». Вот мои экспортируемые функции:Ошибка при удалении указателя в dll C++

extern "C" int colorstream_init(uintptr_t *ptrOut, int *data) 
{ 
    *ptrOut = (uintptr_t)new CDevice(); 
    ((CDevice*)*ptrOut)->init_camera(); 
    *data = ((CDevice*)*ptrOut)->get_data(); 
    return ((CDevice*)*ptrOut)->get_sts(); 
} 

extern "C" int get_image(uintptr_t ptr, uint32_t image[], int size, int *data) 
{ 
    int rtn_val = ((CDevice*)ptr)->get_image(image, size); 
    *data = ((CDevice*)ptr)->get_data(); 
    return rtn_val; 
} 

extern "C" int close(uintptr_t ptr, uint32_t last_image[], int size) 
{ 
// ((CDevice*)ptr)->get_image(last_image, size); 
    int r = ((CDevice*)ptr)->close(); 
    delete (CDevice*)ptr; 
    return r; 
} 

Я попытался переместить «delete (CDevice *) ptr;» выровняйтесь в функцию get_image и получите одно и то же исключение.

Может кто-нибудь помочь, пожалуйста? Я был бы очень признателен!

John

+0

Что делает 'CDevice' в своем деструкторе? –

+0

Вы уверены, что 'ptr' действительно тот же, который вы предоставили в colorstream_init, а не что-то, что было' memcpy' или иным образом заменено обманом, который не был 'new'ed? – user4581301

+0

Какая камера SDK вы используете? Если вы устраните LabVIEW и просто вызовите эти функции в приложении C++, все равно произойдет сбой? Если вы устраняете вызовы SDK камеры и просто выделяете/удаляете простую структуру данных, все еще происходит сбой в LabVIEW? –

ответ

1

Я нашел проблему; благодаря всем, кто помогал. Я получаю, что в вызове библиотеки labview у меня был входной параметр ptr, переданный как «указатель на значение», а не как «значение». Я передаю его из функции init как «Указатель на значение», но его нужно вернуть обратно как «Значение» (очевидно ...).

Это мои первые записи функций в .dll, и я приношу свои извинения за то, что вы заняли время людей с немой ошибкой.

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

  • Нет связанных вопросов^_^