问题是这样的:
比如我在DLL中定义的函数为:
function StrAdd(InputStr,OutPutStr:PChar):Boolean;
begin
try
OutPutStr:=InputStr+'sadf';
Result:=True;
except
Result:=False;
end;
end;
InputStr为输入的值,而OutPutStr为输出值,也就是当StrAdd为TRUE的时候,要得到OutPutStr的值,这个OutPutStr应该怎么定义呢?用var可以吗?
function StrAdd(InputStr,var OutPutStr:PChar):Boolean;
比如我在DLL中定义的函数为:
function StrAdd(InputStr,OutPutStr:PChar):Boolean;
begin
try
OutPutStr:=InputStr+'sadf';
Result:=True;
except
Result:=False;
end;
end;
InputStr为输入的值,而OutPutStr为输出值,也就是当StrAdd为TRUE的时候,要得到OutPutStr的值,这个OutPutStr应该怎么定义呢?用var可以吗?
function StrAdd(InputStr,var OutPutStr:PChar):Boolean;
其中aParms在dll调用之前,可以将你想用的参数放进去。
aParms:=VarArrayCreate([0,n],varVariant);
n是参数的个数。
以下赋值:
aParms[0]:=...
aParms[1]:=...
aParms[2]:=...
aParms[n]:=...Dll调用时:
Value0:=aParms[0];
Value1:=aParms[1];
Value2:=aParms[2];
...
Valuen:=aParms[n];
OutPutStr:=InputStr+'sadf';//OutPutStr/InputStr是指针,不能相加的!!!
Result:=True;
except
Result:=False;
end>>用var可以吗?
>>function StrAdd(InputStr,var OutPutStr:PChar):Boolean;
也不行!如果确实要实现InputStr+'sadf',必须在调用这个函数前为OutPutStr分配足够的内存
OutPutStr:=allocmem(1000);function StrAdd(InputStr,var OutPutStr:PChar):Boolean;
try
move(InputStr^, OutPutStr^,strlen(InputStr));
strcopy(OutPutStr,'sadf');
OutPutStr:=InputStr+'sadf';//OutPutStr/InputStr是指针,不能相加的!!!
Result:=True;
except
Result:=False;
end
end;最后释放内存freemem(OutPutStr);
try
move(InputStr^, OutPutStr^,strlen(InputStr));
strcopy(OutPutStr,'sadf');
Result:=True;
except
Result:=False;
end
end;最后释放内存freemem(OutPutStr);
如果不用var其它还有什么方法吗?
我看到有些软件里的调用里面没有var、也没有外加什么参数就实现了类似的功能了。
var
StrAdd: function(lpInBuffer:PChar; lpOutBuffer:PChar; length:Integer): Boolean; stdcall;
OutputStr: array [0..32] of Char;
begin
FillChar(OutputStr, SizeOf(OutputStr), #0);
Initialize;
if hlib <> 0 then begin
@StrAdd := GetProcAddress(hlib, 'StrAdd');
if @StrAdd <> nil then begin
if StrAdd(lpInBuffer, OutputStr, length) then
Return := OutputStr
else
Return := '函数调用错误!'
end
else
ShowMessage('加载功能模块出错!'); FreeLibrary(hlib);
end
else
ShowMessage('无法加载DLL!');
end;这是我看到的人家的调用。怎么使用呢?
OutputStr: array [0..32] of Char; FillChar(OutputStr, SizeOf(OutputStr), #0);
OutPutStr:=allocmem(1000);效果是一样的
这是外部传入的参数,在DLL不需要定义。谁调用你的dll,谁负责定义它,你不用管它
应该要做什么处理吧?
如果是你写的那把你的代码贴出来。当然不管是谁写的,在调用这个函数之前必须先给OutputStr分配内存,然后才能调用这个函数
那是你的dll写的有错误。也许你的dll忘了加stdcall把你的DLL 代码贴出来。
library AppDll;uses
SysUtils,Windows,Classes,Dialogs;{$R *.res}function AddStr(lpInputStr:PChar;lpOutputStr:PChar):Boolean;stdcall;
begin
try
lpOutputStr:=PChar(StrPas(lpInputStr)+'abcdef');
Result:=True;
except
Result:=False;
end;
end;exports
AddStr;
begin
end.主程序代码:
var
hlib: HMODULE;implementation{$R *.dfm}procedure Initialize;
begin
hlib:= LoadLibrary('AppDLL.dll');
end;Procedure Str(lpInputStr:PChar);
var
AddStr: function(lpInputStr:PChar;lpOutputStr:PChar): Boolean; stdcall;
DllStr:array[0..30] of Char;
begin
FillChar(DllStr, SizeOf(DllStr), #0);
Initialize;
if hlib <> 0 then begin
@AddStr := GetProcAddress(hLib, 'AddStr');
if @AddStr <> nil then begin
if AddStr(lpInputStr, DllStr) then
Form1.Edit1.Text:= DLLStr
else
Form1.Edit1.Text:= '函数调用错误!'
end
else
ShowMessage('加载功能模块出错!'); FreeLibrary(hLib);
end
else
ShowMessage('无法加载DLL!');
end;procedure TForm1.Button1Click(Sender: TObject);
begin
Str(PChar('123456'));
end;