2011-07-26 4 views
0

Codeblocks (mingw에서 GCC 사용) 내에서 Visual Studio 2008 SP1에서 만든 dll (공용 언어 런타임 지원 사용)을 사용하려고합니다. dll에 전달되는 인수 중 일부는 호출 함수에 의해 동적으로 할당됩니다. 내 질문 :DLL 호출의 힙/스택 손상

"dll에 전달되는 인수가 호출하는 함수의 힙에 상주 할 수 있습니까? 안전하게 할 수 있습니까?"

dll에서 돌아 왔을 때 호출 함수의 스택이 손상되어 액세스하려고 할 때이 문제를 디버그하려고 할 때 codeblocks 내에 SIGTRAP이 생깁니다.

왜 이런 이유가있을 수 있습니까?

DLL 함수의 프로토 타입은 다음과 같이 진행됩니다

int __cdecl myTesseractOCR(myOCRData* labels_for_ocr); 

myOCRDaata 정의는 아래와 같습니다 :

typedef struct __ocr_data 
{ 
    char* arr_image  [NUMOBJ_LIMIT_HIGH]; 
    int start_x   [NUMOBJ_LIMIT_HIGH]; 
    int start_y   [NUMOBJ_LIMIT_HIGH]; 
    int  width    [NUMOBJ_LIMIT_HIGH]; 
    int  height    [NUMOBJ_LIMIT_HIGH]; 
    int  widthstep   [NUMOBJ_LIMIT_HIGH]; 
    char  number_plate_buff [2*NUMOBJ_LIMIT_HIGH]; 
    int  ocr_label_count; 
} myOCRData; 

arr_image 점을 호출하는 함수의 힙에있는 데이터를 어디에 같은 모든 위의 구조체의 다른 멤버는 호출하는 함수의 스택에 있습니다. 스택에있는 모든 구성원이 손상되어 프로그램이 SIGTRAP을 생성합니다. 나는 이러한 문제가 stackoverflow의 다양한 스레드에서 모두 논의되는 것을 보았지만 아직 구체적인 해결책을 찾지 못했습니다.

답변

0

DLL이 호출 응용 프로그램 힙에 상주하는 메모리를 액세스하는 것은 매우 합리적입니다. 그렇게 할 수 없다면 DLL은 본질적으로 쓸모가 없다.

문제는 다른 곳에 위치해야합니다. 대부분의 경우 DLL 호출에 대한 매개 변수를 올바르게 설정하지 않은 것 같습니다.

1

DLL 인터페이스를 으로 설정하고 가능한 한으로 설정하는 것이 좋습니다. 즉 구조가 POD이더라도 통과하지 않도록합니다. 2 개의 다른 컴파일러를 사용하고 있기 때문에 이것은 특히 중요합니다. 구조체를 전달하기로 결정했다면 구조체의 패킹이 두 컴파일러 모두에 명시 적으로 정의되어 있는지 확인하십시오.

+1

나는 동의하지 않습니다. DLL에서 내 보낸 함수에 구조를 전달하는 것은 매우 일상적입니다. Win32는 이것에 광범위하게 의존하며 절대적으로 훌륭하게 작동합니다. –

+1

@ David Heffernan 구조체가 동일하게 포장되어있는 한 작동합니다. OP가 2 개의 컴파일러를 사용하기 때문에 다른 패킹이 그가보고있는 손상의 원인 일 수 있습니다. – Praetorian

+0

그것은 실제로 가능한 원인이며이를 수정하는 것은 쉽지 않습니다. –

0

당신은 힙이 기능에 속하지 않는 GCC 및 DLL 규칙 VS2kSP1 CLR

0

에 대한 호출 규칙 플래그를 확인 교차 할 수 있습니다. 모듈에 메모리를 할당하고 다른 모듈에 메모리를 할당하는 것은 문제가되지 않습니다. 메모리를 할당 한 모듈이 메모리를 할당 한 모듈인지 확인하십시오.
문제의 두 번째 원인은 다른 호출 변환 일 수 있습니다. 내 보낸 모든 함수에 대한 호출 규칙을 지정하십시오.