DLL(100分)

  • 主题发起人 主题发起人 jsjyzhangjq
  • 开始时间 开始时间
J

jsjyzhangjq

Unregistered / Unconfirmed
GUEST, unregistred user!
请教各位大侠,一个dll 多个function 的话,exports 部分该怎么输出,还有就是 如果我 dll 中定义了两个函数 A 和B,其中函数 B 又调用了函数A,(dll中可以这样调用其他函数吗?)这个时候如果我在项目中调用dll 中的函数B,是不是连函数A也要一起调用?
 
just try it
 
汗!我就是试了,调用就是出问题了
 
1、exports F1,F2,F...; end.
2、你的 A 和 B 都是同一个 dll 中的函数,直接内部调用即可(比如,A 调用 B 的话,直接引用 B 所在的单元即可),不需要经过 dll exports
3、同 2,主要是你调用导出函数的 B 可以内部调用 A
 
lsuser:你的意思是不是,比如 我的dll 里面有函数a和b,如果函数b调用了函数a,那么函数a 就不要在exports 里面输出?
 
还有就是,如果 函数b调用了函数a,函数a 在后面还要不要加 stdcall 了?
 
这是我的代码:
library PY;

{ Important note about DLL memory management: ShareMem must be the
first unit in your library's USES clause AND your project's (select
Project-View Source) USES clause if your DLL exports any procedures or
functions that pass strings as parameters or function results. This
applies to all strings passed to and from your DLL--even those that
are nested in records and classes. ShareMem is the interface unit to
the BORLNDMM.DLL shared memory manager, which must be deployed along
with your DLL. To avoid using BORLNDMM.DLL, pass string information
using PChar or ShortString parameters. }

uses
SysUtils,
Classes;

function GetPYIndexChar(Hzchar:string):String;stdcall;
begin
case (Word(hzchar[1]) shl 8 + word(hzchar[2])) of
$B0A1..$B0C4 : Result :='A';
$B0C5..$B2C0 : Result :='B';
$B2C1..$B4ED : Result :='C';
$B4EE..$B6E9 : Result :='D';
$B6EA..$B7A1 : Result :='E';
$B7A2..$B8C0 : Result :='F';
$B8C1..$B9FD : Result :='G';
$B9FE..$BBF6 : Result :='H';
$BBF7..$BFA5 : Result :='J';
$BFA6..$C0AB : Result :='K';
$C0AC..$C2E7 : Result :='L';
$C2E8..$C4C2 : Result :='M';
$C4C3..$C5B5 : Result :='N';
$C5B6..$C5BD : Result :='O';
$C5BE..$C6D9 : Result :='P';
$C6DA..$C8BA : Result :='Q';
$C8BB..$C8F5 : Result :='R';
$C8F6..$CBF9 : Result :='S';
$CBFA..$CDD9 : Result :='T';
$CDDA..$CEF3 : Result :='W';
$CEF4..$D1B8 : Result :='X';
$D1B9..$D4D0 : Result :='Y';
$D4D1..$D7F9 : Result :='Z';
else
Result := char(32);
end;
end;
function GetJM(s:string):string;stdcall;
var
sw:wideString;
c,JM:string;
i:integer;
begin
JM:='';
sw:=s;
for i :=1 to length(sw) do
begin
c:= sw;
if length(c)>1 then
JM:=JM+GetPyIndexChar(c)
else
JM:=JM+c;
end;
Result:=JM;
end;

exports
GetPYIndexChar,
GetJM;
{$R *.res}
begin
end.

下面是我的别的地方调用的这个dll的代码
procedure TForm1.Button1Click(Sender: TObject);
type
TGetJM=function(s:string):string;stdcall;
var
DLLHandle: THandle;
Func:TGetJM;
begin
try
DLLHandle := LoadLibrary('py.dll');
if dllhandle<>0 then
@Func := GetProcAddress(DLLHandle,'GetJM');
if Assigned(@Func) then
Edit3.Text:=Func(Edit2.Text);
finally
FreeLibrary(DLLHandle);
end;
end;
现在就在FreeLibrary(DLLHandle); 这句上出错,然后edit3.text 也没有值;
 
exports
F1,
F2,
Fn;
begin
end.

你的意思是不是,比如 我的dll 里面有函数a和b,如果函数b调用了函数a,那么函数a 就不要在exports 里面输出
能做到這樣最好了.
 
多人接受答案了。
 
后退
顶部