如何用DELPHI掉用VC++的DLL库!(100分)

K

kingdjf

Unregistered / Unconfirmed
GUEST, unregistred user!
假如VC++有如下声名:
在CTEST类下有一涵数BOOL CTEST::SAMPLE(INT RATE).
现在用DELPHI编成如何才能调用上述涵数!
 
你是否调用的是C写的DLL,如果是的话:
Function EnCryptoData(EnData:pChar;intLen:integer):Boolean;
var
LibHandle:THandle;
MyCrypto:Function(strData:pChar;strLen:integer):Longint;Stdcall;
begin
LibHandle:=LoadLibrary('动态库名称');//
if LibHandle>0 then
begin
@MyCrypto:=GetProcAddress(LibHandle,'函数名');
if Assigned(MyCrypto) then
//do what you want
else
//调有函数失败
FreeLibrary(LibHandle);
end
else
//调用动态库失败
end;

如果是MFC的类,你可以用C写一DLL(包上想要的函数),用以上的方法来调用,或知道算
法自己来写
 
>>在CTEST类下有一涵数BOOL CTEST::SAMPLE(INT RATE).
>> 现在用DELPHI编成如何才能调用上述涵数!
只有在dll中公布了的函数,才能被其它的程序调用,一个类的方法不能被
直接调。
//mydll.dll
library mydll;
uses
SysUtils,
Classes;

{$R *.RES}
function PlusNum(X,Y:Integer):Integer;stdcall;
begin
Result:=X+Y;
end;

function MinusNum(X,Y:Integer):Integer;stdcall;
begin
Result:=X-Y;
end;

exports
PlusNum index 1 name 'Plus',
MinusNum index 2;
begin
end.

在其它单元中使用时的声明方法:
function Plus(X,Y:Integer):Integer;stdcall;external 'mydll.dll';
function MinusNum(X,Y:Integer):Integer;stdcall;external 'mydll.dll';
调用:
temp:=plus(x,y);
temp:=MinusNUm(x,y);
 
如果要在Delphi和VC之间通过Dll共享类,现在我知道的最好的
方法是使用VTable,我这里有相应的文档,很长,如果需要,我
可以给你Mail一份。
 
http://www.marcocarco.com
 
使用VTable容易造成混乱,因为delphi在VTable的上面加了自己的构造、析构
以及父类的指针,除非要把整个类输出,我不建议使用VTable。我觉得还是
在CTEST类中添加并输出一个函数方便些
 
调用VC的dll,输出名字会和定义的不一样,你得用TDump看看DLL得输出函数名,
然后在VC得DLL中得DEF中定义一下才好用,否则Delphi找不到函数得.
 
Delphi 5 调用 DLLs 有静态调用和动态调用两种。
动态引入的框架如下:
var aLib:THandle;
...
aLib:=LoadLibrary(DLLName);
if aLib>=32 then
begin
Proc:=GetProcAddress(aLib,ProcName)
Try
Proc(...)
...
Finally
FreeLibrary(aLib);
end;
end;

//这里使用了三个 Win API
//LoadLibrary() ,GetProcAddress() 和 FreeLibrary() .
静态引入的方法有三种:
procedure 过程名(参数表);external'DLL文件名';
procedure 过程名(参数表);external'DLL文件名'index 序号;
procedure 过程名(参数表);external'DLL文件名'name 新名;
具体使用您可以到书店看看例程,祝您早日掌握。
 
各位大侠,有没有编译通过的正规代码?
我现在急得不得了!
 
表示关心 添加收藏夹
 
多人接受答案了。
 
顶部