2012-03-07 232 views
-1

我有在Delphi两个应用程序针对我没有任何代码源:解决方法用Delphi DLL

我使用一个接口从应用程序A调用从应用B.实施例的DLL文件,我通常通过服务编号200011,从接口A调用DLL文件B进行值返回。但是,最近应用程序A已经改变了这个变量。我必须添加P00200011才能调用DLL文件B.

我试图创建一个DLL C#,但B中的DLL是使用fastcall约定创建的,我无法更改此DLL文件。

我能做到的其他方法是什么?我没有想法。

+3

这个问题是相当难以理解。请尽量清楚你在问什么。我想说的是'fastcall'是一个MSVC调用约定。你可能是指Delphi的'注册'约定? – 2012-03-07 18:02:56

回答

0

对于我来说哪些部件是你的和什么调用什么并不完全清楚,但是你应该能够在Delphi中用一个接口创建你自己的中间DLL,该接口使用fastcall并使用另一个调用将调用转发给实际DLL惯例。

+0

我必须创建一个没有Delphi的中间DLL我还可以使用什么来创建中间DLL? – user1254829 2012-03-07 20:42:57

2

您需要编写一个封装器DLL。您可以使用要拦截的函数来构建DLL,并且在代码中只需加载并调用原始DLL即可。然后你将你的包装放在你的应用程序的同一个目录中。来自应用程序的所有调用将转到您的包装器DLL并从那里转移到原始DLL。

下面是一个简单的例子

supose你有这个库(B.DLL)

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. 

编译这两个程序并运行它们。打印的结果是2011年

现在,您的代码包装DLL

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. 

构建它,你就会有A.EXE,B.DLL和W.DLL。取代他们

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

执行,现在它会吐出2012

+1

您需要解决调用约定的问题。并且不需要导出。它什么也没做。 – 2012-03-07 18:37:45

+0

有没有必要调用转换,因为包装DLL也写在德尔福。也需要导出,因为包装器DLL代替A.DLL并且必须具有与A.DLL相同的功能。但问题是包装A.DLL不会解决问题!您应该改为包装B.DLL。 – 2012-03-07 20:37:14

+0

嗨,我可以做什么,如果我不能使用Delphi来创建包装DLL – user1254829 2012-03-07 20:40:09