2009-07-29 4 views
1

일부 전역 데이터로 C++ Win32 dll을 생성합니다. 전역으로 정의 된 std :: map이 있으며 dll에지도에 데이터를 기록하는 함수가 있습니다 (쓰기 잠금을 획득 한 후).내 보낸 dll 함수의 dll에서 전역 데이터에 액세스

내 문제는 내가 dllMain dll에서 쓰기 함수를 호출 할 때 문제없이 작동한다는 것입니다. 이것에 대해 할 수있는 일이

WindowsError: exception: access violation reading 0x00000008 

있습니까 : 나는 다른 프로그램에서 DLL을로드하고 세계지도에 데이터를 기록하는 함수를 호출 할 때, 그것은 내게 오류를 준다? DllMain에서 호출 할 때 동일한 함수가 dll의 전역 데이터에 액세스 할 수 있지만 다른 프로세스에서 호출하면 전역 데이터에 액세스 할 수 없습니다. 제발 조언.

저는 TDM-MinGW gcc 4.4.0 컴파일러를 사용하고 있습니다.

편집 : 좋아, 나는 문제이며, 도움들 주셔서 감사합니다,하지만 문제는 생성자 문제 나 글로벌 공간에서지도를 할 수없는,하지만 문제의하지 무엇인지 알아 냈어요 boost :: python 내가 사용하고 있습니다. 나는 그것을 테스트했지만, 파이썬이나 아마도 뭔가 내에서 DLL을 호출했기 때문에, urllib2 모듈은 DLL에로드되지 않았다. 이제 어떻게 수정해야하는지 알아야합니다.

+0

해결 방법으로 답을 적어서 수락하면 문제가 "답변 됨"으로 표시됩니다. 그 중 하나가 가장 도움이되는 기존 답변을 수락하십시오. – RBerteig

답변

1

코드가 호출되었을 때 std::map의 생성자가 아직 실행되지 않은 것 같습니다. Win32 DLL에서 전역이 아닌 POD의 수명은 매우 까다 롭습니다. MinGW가 어떻게 특수하게 처리하는지는 확실하지 않습니다. 그러나 DLL을 컴파일하는 방식 일 수도 있고 자신의 함수 (DllMain?)를 진입 점으로 설정 한 것일 수 있으며 따라서 생성자를 호출하는 CRT 초기화 루틴을 오버로드 할 수 있습니다.

+0

DllMain (DLL_PROCESS_ATTACH)이 호출되기 전에 dll 내부의 모든 전역 개체가 초기화된다는 것을 읽었습니다. DllMain (DLL_PROCESS_DETACH)이 호출 된 후 소멸자가 호출됩니다. 그래서 나는 이것을 가정하고 너무 많은 코드를 작성했다고 가정했다. 그러나 그것이 작동하지 않는다면, 전역 포인터를 생성하고 DllMain 내에서 맵을 생성하고 파괴하는 것이 안전할까요? – Sahas

+0

나는 Dll이로드 될 때 DllMain의 맵에 데이터를 삽입하기 때문에 std :: map의 생성자가 호출되고 있음을 확신한다. 그러나 일단로드되면 다른 프로세스에서 함수를 호출하면, 작동하지 않습니다. – Sahas

+0

"다른 프로세스의 함수 호출"이란 무엇입니까? DLL은 항상 사용되는 프로세스로로드됩니다. –

0

서로 다른 프로세스에 별도의 주소 공간이 있기 때문에 공유 메모리를 사용해야합니다. std :: map running을 얻지 못할 것이라고 생각합니다. MapViewOfFile, CreateFileMapping, OpenFileMapping 및 일반 오래된 데이터를 사용하는 것이 좋습니다. Google/MSDN에 문의하십시오.

+0

필자가 언급 한 데이터는 필자가 작성한 dll에서만 필수/사용되며 dll을 사용하는 응용 프로그램은 데이터에 액세스 할 필요가 없습니다. 함수가 데이터에 액세스하도록하는 다른 방법이 있습니까? – Sahas

+0

아마도 프로세스 중 하나를 데이터의 소유자로 정의 할 수 있습니까? 그리고 : 키와 값은 serialzable입니까?그렇다면 프로세스 간 의사 소통의 수단을 사용할 수 있습니다. 다른 프로세스가지도를 너무 많이 사용하지 않는 경우에도 괜찮습니다. –

1

이렇게 낮은 메모리 주소에서 읽기 오류는 일반적으로 어딘가에 NULL 포인터에 액세스하려고한다는 것을 의미합니다. 실제 코드를 보여줄 수 있습니까?

관련 문제