동일한 인터페이스와 호출 규칙을 가진 모든 동일한 기능을 가진 dll을 만드는 것 외에도 대체 dll은 원본의 서수를 포함하여 내보내기 맵을 정확하게 복제해야합니까? 그래서 GetProcAddress를 통한 명시 적로드뿐만 아니라 암시 적 연결도 가능합니까?기존 dll에 드롭 인 대체 방법을 만드는 방법은 무엇입니까?
(편집 :이 내가 아니라 그물에 대해서 이야기하고 관리되지 않는, C/C++ 윈도우 DLL입니다)
동일한 인터페이스와 호출 규칙을 가진 모든 동일한 기능을 가진 dll을 만드는 것 외에도 대체 dll은 원본의 서수를 포함하여 내보내기 맵을 정확하게 복제해야합니까? 그래서 GetProcAddress를 통한 명시 적로드뿐만 아니라 암시 적 연결도 가능합니까?기존 dll에 드롭 인 대체 방법을 만드는 방법은 무엇입니까?
(편집 :이 내가 아니라 그물에 대해서 이야기하고 관리되지 않는, C/C++ 윈도우 DLL입니다)
당신은 어떤 다른 클라이언트가 사용하는 모든 수출을 모방해야합니다, 당신은 필요가 없습니다 아무도 사용하지 않고있는 "죽은"수출을 흉내 낸다. 다른 클라이언트가 내보내기 이름 대신 서수를 사용하여 연결되는 경우에만 서수를 유지해야합니다 (매우 드뭅니다).
dll에 C++ 클래스가 포함되어 있고 extern "C"를 사용하지 않는 경우 바이너리 비교 가능성을 유지해야합니다. 즉, 대체 DLL의 클래스가 원래의 클래스와 같은 순서로 같은 필드를가집니다. 사용하는 인터페이스가 vtable을 각 메소드에 대해 동일한 인수로 유지해야하는 경우.
고마워요! 나는 수업을 생각하지 않았다. 내 특별한 경우는 "C"함수라고 생각하여 .def 파일에서 서수를 지정하면됩니다. 나는 "dumpbin/exports"에서 "힌트"열도 있다는 것을 알아 차렸고, 호환성을 손상시키지 않고 차이점을 보존 할 수 있는지도 알아 냈습니다. – Bogatyr
오, 한가지 더. "dumpbin/exports original.dll"은 같은 엔트리 포인트에 대해 여러 개의 엔트리를 포함하고 있습니다 : "foo"및 "foo @ 4"는 다른 서수이지만 동일한 엔트리 포인트입니다. 내보내기 맵에서 이러한 "@n"별칭을 어떻게 만듭니 까? – Bogatyr
@Bogatyr 매개 변수의 크기는 foo는 매개 변수가 없음을 의미합니다. foo @ 4는 foo (int)입니다. foo @ 8은 foo (int, int)를 의미합니다. –