across DLL boundaries (cross-DLL problem)
저장소/VC++출처 MSDN: https://msdn.microsoft.com/ko-kr/library/ms235460.aspx
실수는 돌고 돌고 반복되고...
static link library로 바꾸거나 run-time library를 md로 변경하거나.
shared_ptr 을 삭제자를 지정해서 사용하면 극복 mt runtime에서 극복 가능??
DLL 경계를 넘어 CRT 개체를 전달할 때 발생할 수 있는 오류
파일 핸들, 로케일, 환경변수 같은 C Run-time(CRT) 객체를 DLL의 내부 혹은 외부로 전달할 때 ( DLL의 경계를 지나는 함수 호출), DLL 이나 DLL을 호출한 파일에서 서로 다른 CRT 라이브러리 사본을 사용하고 있다면, 예기치 않은 문제가 발생할 수 있습니다.
이 문제의 또 다른 현상으로 디버깅 중 출력창에 다음과 같은 오류가 나타날 수 있습니다.
HEAP[]: 잘못된 주소를 RtlValidateHeap(#,#)로 지정합니다.
또한, CRT 라이브러리의 각 복사본이 자신의 힙 관리자를 가지기때문에, 하나의 CRT 라이브러리에서 메모리를 할당하는 것과 CRT라이브러리의 다른 복사본으로 해제되기 위한 DLL 경게를 통해 포인터를 전달하는 것은 힙 손상을 잠재적인 원인이 됩니다.
이 msvcrt40.dll(버전 4.20)의 전달자 DLL버전은 재배포될수 없음에 주의하세요.
설명
이 예제는 DLL경계를 통해 파일 핸들을 전달합니다.
DLL과 .exe 파일은 /MD를 사용하여 빌드되어서 그들이 CRT의 단일 복사본을 공유합니다.
만일 CRT의 분리된 복사본을 사용하도록 /MT를 사용하여 리빌드된 경우, test1Main.exe 결과를 실행하는 것은 접근 위반에서 실행합니다.
코드
// test1Dll.cpp // compile with: /MD /LD #include <stdio.h> __declspec(dllexport) void writeFile(FILE *stream) { char s[] = "this is a string\n"; fprintf( stream, "%s", s ); fclose( stream ); }
코드
// test1Main.cpp // compile with: /MD test1dll.lib #include <stdio.h> #include <process.h> void writeFile(FILE *stream); int main(void) { FILE * stream; errno_t err = fopen_s( &stream, "fprintf.out", "w" ); writeFile(stream); system( "type fprintf.out" ); }
Output
this is a string
설명
이 예제에서는 DLL 경계를 통해 환경 변수를 전달합니다.
코드
// test2Dll.cpp // compile with: /MT /LD #include <stdio.h> #include <stdlib.h> __declspec(dllexport) void readEnv() { char *libvar; size_t libvarsize; /* Get the value of the MYLIB environment variable. */ _dupenv_s( &libvar, &libvarsize, "MYLIB" ); if( libvar != NULL ) printf( "New MYLIB variable is: %s\n", libvar); else printf( "MYLIB has not been set.\n"); free( libvar ); }
코드
// test2Main.cpp // compile with: /MT /link test2dll.lib #include <stdlib.h> #include <stdio.h> void readEnv(); int main( void ) { _putenv( "MYLIB=c:\\mylib;c:\\yourlib" ); readEnv(); }
Output
MYLIB has not been set.
만일 CRT의 복사본을 하나만 사용하도록 /MD과 함께 DLL 및.exe 파일이 빌드되는 경우, 프로그램이 성공적으로 실행하고 다음과 같이 출력됩니다:
New MYLIB variable is: c:\mylib;c:\yourlib
'저장소 > VC++' 카테고리의 다른 글
ATL and MFC String Conversion Macros 사용 시 주의할 점 (0) | 2016.04.08 |
---|---|
VS2012의 tuple (0) | 2014.09.17 |
[펌] shlwapi 의 파일 경로 관련 API 모음 (0) | 2014.08.13 |
strftime format 좀 기억하자! (0) | 2014.08.08 |
SQLite - Syntax (0) | 2014.05.27 |