문제

나는 exe라는 이름이 있습니다 test.exe 일반적으로 독립형 응용 프로그램으로 사용됩니다. 이 exe를 다른 응용 프로그램 인 app.exe 내에서 모듈 (DLL)으로 사용하고 싶습니다.

test.exe의 코드는 정말 간단한 일을합니다.

void doTest()
{
    MyClass *inst = new MyClass();
    inst->someMethod();
}

어디에 someMethod() IS 가상 및 MyClass에는 가상 D 'Tor가 있습니다.
doTest() test.exe에서 내보내므로 test.lib라는 lib가 생성됩니다.
app.exe는이 lib와 연결되어 정적으로로드 test.exe가 시작될 때입니다.

test.exe 독립형 alone을 실행하면 잘 실행되지만 실행 중에는 app.exe 내에서로드하면 충돌이 발생합니다.
디버거와 함께 코드를 밟으면 충돌이 가상 방법으로 호출되는 것으로 나타났습니다. vftable은 어떻게 든 나빠진다는 것이 밝혀졌습니다.

일부 조사 후 MyClass 생성자 내부의 코드가 실행될 때 VFTable은 한 가지 일이지만 호출은 new 반품은 "로컬 vftable"이라고 불리는 다른 것으로 대체됩니다. 나는 찾았다 이것이 왜 그런지에 대한 모호한 토론입니다.

디버깅을 약 하루 후에이 "로컬 vftable"의 포인터는 두 경우 모두 동일하며 Test.exe가 단독으로 있고 모듈로로드 될 때 모두 동일합니다. test.exe가 다른 주소로로드 되었기 때문에 이것은 옳을 수 없습니다 ...
이 이론을 테스트하기 위해 링커 옵션의 로딩 주소를 test.exe가 app.exe에있을 때로드되는 곳으로 변경했습니다. 이제 모든 것이 작동합니다.

분명히, 이것은 무작위로 선택된이 주소가 점유 될 수 있고 동일한 문제가 다시 발생하기 때문에 이것은 영구적 인 솔루션이 아닙니다.

그래서 내 질문 : 왜 이것이 "로컬 Vftable"이 EXE의 정적 로딩 주소에 묶여 있습니까? EXE를 모듈로로드하는 것이 나쁜 일입니까? EXE가 정적 주소에로드되었다고 가정하는 이유는 무엇입니까?

컨텍스트를 위해 : 이것은 모두 MSVC 2008, Windows XP X64로 이루어집니다.

도움이 되었습니까?

해결책 2

내가 사용한 해결 방법은 단순히 컴파일 구성을 추가하고 EXE를 실제 DLL으로 컴파일하는 것입니다.

사용 /fixed:no 어떤 이유로 문제를 해결하지 못했습니다.

Exes와 DLL의 또 다른 차이점은 진입 점이 다르다는 것입니다. DLL의 진입 점은 DLLMAIN입니다. 여기서 EXE는 CRT에 진입 점이 있는데, 이는 결국 main () 또는 winmain ()을 호출합니다.

다른 팁

VC ++는 일반적으로 재배치 할 필요가 없기 때문에 기본적으로 .exes에서 regoc info를 제거합니다.

/수정 된 정보를 유지하도록 강요 할 수 있습니다. 보다: http://msdn.microsoft.com/en-us/library/w368ysh2.aspx

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top