如果在DLL和主程序中使用一个全局变量?

Sunblog 2005-03-17 03:52:07
问题是这样的:
比如我在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;
...全文
296 16 打赏 收藏 转发到动态 举报
写回复
用AI写文章
16 条回复
切换为时间正序
请发表友善的回复…
发表回复
Sunblog 2005-03-22
  • 打赏
  • 举报
回复
这是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;
flyinwuhan 2005-03-21
  • 打赏
  • 举报
回复
>>但是我按照人家的调用得不到OutputStr值。
那是你的dll写的有错误。

也许你的dll忘了加stdcall

把你的DLL 代码贴出来。。。。。。。
Heyongfeng 2005-03-21
  • 打赏
  • 举报
回复
贴代码吧.
flyinwuhan 2005-03-18
  • 打赏
  • 举报
回复
>>那么lpOutBuffer在DLL应该怎么定义
这是外部传入的参数,在DLL不需要定义。谁调用你的dll,谁负责定义它,你不用管它
Sunblog 2005-03-18
  • 打赏
  • 举报
回复
DLL是自己写,然后调用也是我自己,我只是在调用的时候让参数得到DLL处理后的值,而不是通过返回。
flyinwuhan 2005-03-18
  • 打赏
  • 举报
回复
晕倒。。。。。。

俺到现在还不明白这个DLL到底是你写的还是别人写的?
如果是你写的。。。那把你的代码贴出来。。。。。。。

当然不管是谁写的,在调用这个函数之前必须先给OutputStr分配内存,然后才能调用这个函数。。。
Sunblog 2005-03-18
  • 打赏
  • 举报
回复
但是我按照人家的调用得不到OutputStr值。
应该要做什么处理吧?
Sunblog 2005-03-17
  • 打赏
  • 举报
回复
to:flyinwuhan

我帖出来的是人家调用DLL的代码,那么lpOutBuffer在DLL应该怎么定义,这样才可以在主程序中得到一个值?
kuki84 2005-03-17
  • 打赏
  • 举报
回复
顶。
flyinwuhan 2005-03-17
  • 打赏
  • 举报
回复
人家的调用都贴出来了。。。对的啊!照着用就可以了!

不同的是它在栈上分配内存,我在堆上
OutputStr: array [0..32] of Char; FillChar(OutputStr, SizeOf(OutputStr), #0);
OutPutStr:=allocmem(1000);

效果是一样的
Sunblog 2005-03-17
  • 打赏
  • 举报
回复
procedure StrAdd(lpInBuffer:PChar; length:Integer);
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;

这是我看到的人家的调用。怎么使用呢?
Sunblog 2005-03-17
  • 打赏
  • 举报
回复
不好意思啊,那里说错了
如果不用var其它还有什么方法吗?
我看到有些软件里的调用里面没有var、也没有外加什么参数就实现了类似的功能了。
dmyb7233 2005-03-17
  • 打赏
  • 举报
回复
输出参数这样定是没问题的
flyinwuhan 2005-03-17
  • 打赏
  • 举报
回复
function StrAdd(InputStr,var OutPutStr:PChar):Boolean;
try
move(InputStr^, OutPutStr^,strlen(InputStr));
strcopy(OutPutStr,'sadf');

Result:=True;
except
Result:=False;
end
end;

最后释放内存freemem(OutPutStr);
flyinwuhan 2005-03-17
  • 打赏
  • 举报
回复
try
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);
victor_yang 2005-03-17
  • 打赏
  • 举报
回复
function StrAdd(InputStr,OutPutStr:PChar;aParms:Olevariant):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];

5,388

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧