나는 그들 사이의 데이터 공유 메커니즘을 제공하기 위해 동일한 프로세스에서 DLL을 조정하는 방법을 찾고있다. 목표는 모든 DLL에 대해 동일한 공유 코드를 사용하고 주 프로그램에 의해로드 된 첫 번째 프로그램이 공유 항목에 대한 관리자 역할을하는 방식으로 조정되도록하는 것입니다. 주 응용 프로그램을 수정할 수 없기 때문에 관리자를 설정하고 다른 DLL과 메모리 주소를 공유하는 것은 불가능합니다. 이 메커니즘을 사용하는 DLL 집합은 다양 할 수 있으므로이 중 하나가로드 될 것이라고 명시 할 수는 없습니다.호스트 프로그램의 도움없이 동일한 프로세스에서 여러 DLL을 어떻게 조정할 수 있습니까?
내가 고려한 한 가지 해결책은 프로세스의 환경 변수에 메모리 주소를 추가하는 것입니다. 첫 x 째 DLL은 환경 변수가 아직 설정되지 않았 음을보고 관리자 오브젝트를 작성하고 변수를 해당 주소로 설정합니다. 다른 DLL은 변수를보고 그로부터 관리자 객체에 대한 포인터를 생성합니다.
환경 변수가 이미 설정되지 않았고 SetEnvironmentVariable/GetEnvironmentVariable이 여러 가지 이유로 실패 할 수 있다는 보장이 없기 때문에 이것은 원하는 바에 가깝지만 다소 미숙 한 것처럼 보입니다.
더 나은 방법이 있나요? 프로세스의 컨텍스트에서 명명 된 포인터를 저장하고 검색하는 방법을 찾고 있지만, DLL을 협업하기위한 근본적인 문제에 대한 더 나은 솔루션을 가지고 있다면 이것을 받아 들일 수도 있습니다.
필자는 이것을 고려했지만 전용 관리자 DLL이 하나만있는 것을 선호합니다. DLL은 Game Maker 확장이며 제안 된 경로를 따르기 위해 관리자 DLL은이 시스템을 사용하는 모든 확장에 포함되거나 확장을 사용하려는 프로그래머가 수동으로 포함해야합니다. 이 여분의 의존성을 피하기 위해 – Medo42
@cdhowie 모듈은 Windows에서 동시에 초기화 할 수 없습니다. 로더 락은 한 번에 하나의 DLL 엔트리 포인트 만 실행되도록 보장합니다. – bdonlan
@ Medo42 : 솔루션은 각 DLL에 자체 관리자를 제공하는 것입니다. 관리자를 업그레이드해야 할 때 어떻게됩니까? 하나의 모듈이 이전 버전을 구현하고 먼저로드되면, 프로세스는 이전 버전을 사용해야합니다. 종속성은 성가신 일이지만이 상황은 관리자의 버전이 예측할 수 없으므로이 상황은 곧 DLL 지옥의 * 더 나쁜 버전이 될 것입니다. 개발자들에게 그렇게하지 마십시오. 적절한 헤더 파일에 대한 강한 의존성은 장기적으로 당신의 삶 (그리고 개발자들의 삶)을 훨씬 쉽게 만들어 줄 것이다. – cdhowie