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;interfaceuses
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.

解决方案 »

  1.   

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

  2.   

    试试在主程序、动态连接库的工程文件里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;
      

  3.   

    这个问题现在已经解决,我用的方法是直接使用API函数,而不再使用DELPI 封装的对话框。