DLL的PCHAR参数传递问题?高手请进,现在没有分!!!!

jxc163 2003-05-24 07:49:00
DLL是函数的声明:

Function ShowBGSetupForm(PH:THandle;IsImage:boolean;Fname:PChar;var Fcolor:Tcolor):pchar;stdcall;
Begin
Application.Handle:=PH;
with TBGSetupForm.Create(Application) do
try
begin
Return:='0';
if IsImage then
begin
RBTNImage.Checked:=IsImage;
edtImageName.Text:=Fname;
end
else
begin
RBTNColor.Checked:=not IsImage;
OldColor:=FColor;
CBColorValue.Selected:=Fcolor;
PLPreviewColor.Color:=Fcolor;
end;

ShowModal;
end;
finally
//如何让选择的文件名称返回到调用者?
FName:=PChar(EdtImageName.Text);
FColor:=PLPreviewColor.Color;
Result:=Return;
Free;
end;
end;


主程序:

unit BGSetup;

interface

uses
Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
Dialogs, StdCtrls, ExtCtrls, ExtDlgs, jpeg;

type
TBGSetupForm = class(TForm)
BTNOK: TButton;
BTNCancel: TButton;
RBTNImage: TRadioButton;
RBTNColor: TRadioButton;
edtImageName: TEdit;
CBColorValue: TColorBox;
PLPreviewColor: TPanel;
BTNAllColor: TButton;
ColorDialog: TColorDialog;
ImgPreviewImage: TImage;
OpenPictureDialog1: TOpenPictureDialog;
procedure BTNOKClick(Sender: TObject);
procedure BTNCancelClick(Sender: TObject);
procedure RBTNImageClick(Sender: TObject);
procedure RBTNColorClick(Sender: TObject);
procedure CBColorValueChange(Sender: TObject);
procedure BTNAllColorClick(Sender: TObject);
procedure edtImageNameExit(Sender: TObject);
procedure edtImageNameKeyPress(Sender: TObject; var Key: Char);
private
Return:Pchar;
OldColor:TColor;
{ Private declarations }
public
{ Public declarations }
end;

Function ShowBGSetupForm(PH:THandle;IsImage:boolean;Fname:pchar;var Fcolor:Tcolor):pchar;stdcall;

var
BGSetupForm: TBGSetupForm;

implementation

{$R *.dfm}

Function ShowBGSetupForm(PH:THandle;IsImage:boolean;Fname:PChar;var Fcolor:Tcolor):pchar;stdcall;
Begin
Application.Handle:=PH;
with TBGSetupForm.Create(Application) do
try
begin
Return:='0';
if IsImage then
begin
RBTNImage.Checked:=IsImage;
edtImageName.Text:=Fname;
end
else
begin
RBTNColor.Checked:=not IsImage;
OldColor:=FColor;
CBColorValue.Selected:=Fcolor;
PLPreviewColor.Color:=Fcolor;
end;

ShowModal;
end;
finally
//如何让选择的文件名称返回到调用者?
FName:=PChar(EdtImageName.Text);
FColor:=PLPreviewColor.Color;
Result:=Return;
Free;
end;
end;

procedure TBGSetupForm.BTNOKClick(Sender: TObject);
begin
if RBTNImage.Checked then Return:='1';
if RBTNColor.Checked then Return:='2';
close;
end;

procedure TBGSetupForm.BTNCancelClick(Sender: TObject);
begin
Return:='0';
close;
end;

procedure TBGSetupForm.RBTNImageClick(Sender: TObject);
begin
OldColor:=PLPreviewColor.Color;
PLPreviewColor.Color:=clBtnFace;
RBTNColor.Checked:=False;
CBColorValue.Enabled:=False;
BTNAllColor.Enabled:=False;

EdtImageName.Enabled:=true;
end;

procedure TBGSetupForm.RBTNColorClick(Sender: TObject);
begin
EdtImageName.Enabled:=False;
RBTNImage.Checked:=false;

PLPreviewColor.Color:=OldColor;
CBColorValue.Enabled:=True;
BTNAllColor.Enabled:=True;
end;

procedure TBGSetupForm.CBColorValueChange(Sender: TObject);
begin
PLPreviewColor.Color:=CBColorValue.Selected;
end;

procedure TBGSetupForm.BTNAllColorClick(Sender: TObject);
begin
// ColorDialog.Color:=CBColorValue.Selected;
if ColorDialog.Execute then
begin
CBColorValue.Selected:=ColorDialog.Color;
PLPreviewColor.Color:=ColorDialog.Color;
end;
end;

procedure TBGSetupForm.edtImageNameExit(Sender: TObject);
var pic:TPicture;
begin
if EdtImageName.Text<>'' then
if Fileexists(EdtImageName.Text) then
begin
try
pic:=TPicture.Create;
try
pic.LoadFromFile(EdtImageName.Text);
except
EdtImageName.Clear;
EdtImageName.SetFocus;
messagebox(handle,'指定文件不是图形文件,或者是本程序不能兼容的文件类型。','信息',MB_ICONINFORMATION OR MB_OK);
end;
ImgPreviewImage.Picture:=pic;
finally
Pic.Free;
end;
end
else
begin
messagebox(handle,'指定文件不存在,请重新指定。','警告',+MB_ICONWARNING OR MB_OK);
EdtImageName.Clear;
EdtImageName.SetFocus;
end;

end;

procedure TBGSetupForm.edtImageNameKeyPress(Sender: TObject;
var Key: Char);
begin
if key=#13 then EdtImageNameExit(sender);
end;

end.


...全文
48 5 打赏 收藏 转发到动态 举报
写回复
用AI写文章
5 条回复
切换为时间正序
请发表友善的回复…
发表回复
jxc163 2003-05-31
  • 打赏
  • 举报
回复
这个问题现在已经解决,我用的方法是直接使用API函数,而不再使用DELPI 封装的对话框。
xml1123 2003-05-28
  • 打赏
  • 举报
回复
试试在主程序、动态连接库的工程文件里Uses后面加上ShareMEM单元。
Function ShowBGSetupForm(PH:THandle;IsImage:boolean;Fname:PChar;var Fcolor:Tcolor):pchar;stdcall;
改为
Function ShowBGSetupForm(PH:THandle;IsImage:boolean;var Fname:PChar;var Fcolor:Tcolor):pchar;stdcall;
jxc163 2003-05-27
  • 打赏
  • 举报
回复
我现在可以返回自己输入的值(不包括中文,如果包括中文的话,就会出错。我只调试通过一次,很奇怪!),如果通过打开文件的对话框来选择文件的话,就不行了,请问是什么原因,有好的解决办法吗?
Eastunfail 2003-05-24
  • 打赏
  • 举报
回复
FName:=PChar(EdtImageName.Text);


EdtImageName.Text封装了一个返回文本的函数。不过作为参数返回,被放到程序运行栈上,你得到了他的指针。。。。。但是当该方法结束之后,栈上面的内容将被清空,所以FName所指向的内存区域无效。。。。。


cosda99 2003-05-24
  • 打赏
  • 举报
回复
太复杂了,能不写简单点,或是将你的思路说详细点

1,183

社区成员

发帖
与我相关
我的任务
社区描述
Delphi Windows SDK/API
社区管理员
  • Windows SDK/API社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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