다른 답변에서 언급했듯이 이것은 불가능합니다.
문제를 해결하려면 DLL에서 구조체 정의를 내 보낸 다음 전역 변수의 주소를 반환하는 전역 함수를 내 보내면됩니다. exe에서이 함수를 임포트하고 이것을 호출하여 dll에 정의 된 전역 struct 객체에 대한 포인터를 얻습니다. 코드는 다음과 같습니다 ...
structOne.h 파일을 추가하고 구조체 정의를 해당 파일로 이동하십시오. 정의를 다음과 같이 수정하십시오.
#ifdef TESTDLL_EXPORTS
#define TESTDLL_API __declspec(dllexport)
#else
#define TESTDLL_API __declspec(dllimport)
#endif
struct TESTDLL_API structOne{
double varOne;
double varTwo;
} ;
DLL에 C++ 사전 처리기 매크로 TESTDLL_EXPORTS를 추가하십시오.
이와 비슷한 전역 함수를 structOne.cpp 파일에 정의하고 내보내십시오.
structOne myStruct; // your global variable
TESTDLL_API structOne* getStruct(){return &myStruct;}
그런 다음 DLL을 빌드하십시오.
.exe에서 다음 코드를 사용하여 메서드를 호출합니다. 는 또한 자체 (0) DLL 내재적 존재 오프셋되지만 심볼 그 오프셋 (".varOne"
)에 대응하지 않은 structOne.h 헤더 파일
typedef structOne* (*getStruct)();
HMODULE libraryHandle = ::LoadLibraryA("TestDLL.dll");
getStruct fn = (getStruct)::GetProcAddress(libraryHandle, "getStruct");
structOne* s = (*fn)();
난 당신이 DLL의 코드는 응용 프로그램에서 사용되는 방법을 오해 생각합니다. 응용 프로그램은 dll에있는 구조의 자체 RAM에 로컬 사본을 만듭니다. POD입니다. 실행 파일의 동일한 주소 공간에 상주하는 실행 코드 (즉 함수)도 마찬가지입니다. 따라서 전체 "LoadLibrary"호출은 DLL의 내용을 모듈 (exe)의 주소 공간에 물리적으로로드합니다. – johnathon
답변은 어디에 있습니까? 불행히도 downvote는 불가능합니다. –