2012-03-07 2 views
-1

내가 어떤 코드 소스 갖고 있지 않은 델파이에서 두 개의 응용 프로그램이 : 나는 보통 통과일 주위 델파이 DLL

내가 응용 프로그램 B. 예에서 DLL 파일을 호출하는 응용 프로그램 A에서 인터페이스를 사용합니다 값 반환을 위해 DLL 파일 B를 호출하기위한 인터페이스 A의 서비스 번호 200011. 그러나 최근에는 응용 프로그램 A가 변수를 변경했습니다. DLL 파일 B를 호출하기 위해 P00200011을 추가해야합니다.

DLL C#을 만들려고했지만 fastcall 규칙으로 DLL이 만들어졌으며이 DLL 파일을 변경할 수 없습니다.

내가 할 수있는 다른 방법은 무엇입니까? 나는 아이디어가 없어.

+3

이 질문은 오히려 이해할 수없는 것입니다 침을 것입니다. 당신이 묻고있는 것을 분명하게하려고 노력합니다. 내가 말하고자하는 것은 'fastcall'이 MSVC 호출 규칙이라는 것입니다. 델파이의 '등록'대회를 의미할까요? –

답변

0

내게 어떤 부분이 무엇인지 부르는 것은 완전히 분명한 것은 아니지만 fastcall을 사용하고 다른 호출을 사용하여 실제 DLL로 호출을 전달하는 인터페이스를 사용하여 Delphi에서 직접 DLL을 만들 수 있어야합니다 협약.

+0

델파이가 아닌 중간 DLL을 만들어야 만 중간 DLL을 만드는 데 사용할 수 있습니까? – user1254829

2

래퍼 DLL을 작성해야합니다. 인터셉트하려는 함수로 DLL을 빌드하면 코드에서 원래 DLL을로드하고 호출하기 만하면됩니다. 그런 다음 랩퍼를 응용 프로그램의 동일한 디렉토리에 두십시오. 응용 프로그램의 모든 호출은 래퍼 DLL로 이동하고 원래의 DLL로 이동합니다.

여기에 간단한 예를

이 라이브러리 (B.DLL)가 supose

library B; 
function B_FUNCTION(value:integer): integer; export; 
begin 
    result:=value+1; 
end; 
exports B_FUNCTION; 
end. 

그리고 그것은

program A; 
{$apptype console} 
function B_FUNCTION(value:integer): integer; external 'b.dll'; 
var i:integer; 
begin 
    i:=B_FUNCTION(2010); 
    writeln(i); 
end. 

두 프로그램을 컴파일하고 실행 사용이 프로그램입니다. 인쇄 결과는

library w; 
uses windows; 
function B_FUNCTION(value:integer): integer; export; 
var 
    adll: Thandle; 
    afunc: function(v:integer):integer; 
begin 
    adll:=LoadLibrary('TRUE_B.DLL'); 
    afunc:= GetProcAddress(adll,'B_FUNCTION'); 
    result:=afunc(value+1); 
    FreeLibrary(adll); 
end; 
exports B_FUNCTION; 
end. 

이 빌드 귀하의 래퍼 DLL 코드, 이제 2011 년

, 당신은 a.exe를, B.DLL 및 W.DLL을해야합니다. 그들이

REN B.DLL TRUE_B.DLL 
REN W.DLL B.DLL 

을 실행 바꾸기, 지금은 2012 년

+1

호출 규칙 문제를 해결해야합니다. 그리고 수출은 필요하지 않습니다. 그것은 아무것도하지 않습니다. –

+0

래퍼 dll도 Delphi로 작성 되었기 때문에 호출 변환이 필요하지 않습니다. 또한 wrapper dll이 A.DLL 대신에 있고 A.DLL과 동일한 기능을 가져야하므로 내보내기가 필요합니다. 그러나 문제는 A.DLL을 래핑하여 문제를 해결할 수 없다는 것입니다. B.DLL 대신 랩핑해야합니다. –

+0

안녕하세요, 델파이를 사용하여 래퍼 DLL을 만들 수 없으면 무엇을 할 수 있습니까? – user1254829

관련 문제