4

我正在开发一个组件delphi 7delphi 2006组件使用一个.pas (不是我的)文件,该文件需要一个DLL文件存在于应用程序目录中。

可以将DLL文件嵌入到组件中,这样当用户将其放在表单上或在运行时创建它时,DLL会将其放置在应用程序目录中吗?

目前

1)我告诉用户将DLL文件放在应用程序目录中。

2)DLL在 Resources 中添加文件,以便在创建时,我可以将其DLL放入应用程序目录中?来自delphidabbler_embed_resource。这是我用

   {Drop the Resource..!!!}

     procedure DropDllToApplicationDirectOry(applicationPath : string);
     var
           RS: TResourceStream;
     begin
           // Create resource stream
          RS := TResourceStream.CreateFromID(HInstance, 100, RT_RCDATA);
     try
         //  applicationPath : example  c:\MyTestProject Lee\
        if DirectoryExists(applicationPath) then         RS.SaveToFile(applicationPath+'myDllFileWhichIsNeeded.dll')
     finally
     // Free the stream
     RS.Free;
    end;
  end;

这会将DropDllToApplicationDirectOry 资源从{$RmyDllFileWhichIsNeeded.dll.RES}and drope 带到该位置,但是

DropDllToApplicationDirectOry当我将组件放在表单上时如何调用它?

我尝试initialization了该组件,但没有复制 DLL,所以我得到了错误 在此处输入图像描述

编辑 对于当RXControls我们TRxClock放弃时钟运行在此表单上时,时钟开始运行(显示当前时间)......所以我尝试了这个

 constructor Tmycomponeny.Create(AOwner: TComponent);
   begin
      inherited Create(AOwner);
      {add dll}
      DropDllToApplicationDirectOry(ExtractFilePath(Application.ExeName));
  end;

但这不起作用..

的代码RXControls

  constructor TRxClock.Create(AOwner: TComponent);
  begin
    inherited Create(AOwner);
    if not Registered then begin
     ClockInit;
    Registered := True;
  end;
   Caption := TimeToStr(Time);
   ControlStyle := ControlStyle - [csSetCaption] 
   {$IFDEF WIN32} - [csReplicatable] {$ENDIF};
   BevelInner := bvLowered;
   BevelOuter := bvRaised;
   FTimer := TRxTimer.Create(Self);
   FTimer.Interval := 450; { every second }
   FTimer.OnTimer := TimerExpired;
   FDotsColor := clTeal;
   FShowSeconds := True;
   FLeadingZero := True;
   GetTime(FDisplayTime);
   if FDisplayTime.Hour >= 12 then Dec(FDisplayTime.Hour, 12);
   FAlarmWait := True;
  FAlarm := EncodeTime(0, 0, 0, 0);
 end;

在此处输入图像描述

4

4 回答 4

6

一般来说,这个想法是行不通的。您假设开发人员总是将您的组件放到表单上。但他们也可以从修订控制中检查现有项目,然后不会创建 DLL。

在我看来,您应该简单地记录依赖关系并让开发人员确保满足依赖关系。建议他们将 DLL 添加到他们的修订控制系统中,以便将其检出到应用程序目录中。

开发人员在部署时需要注意这种依赖性。这必须是开发商的责任。因此,让开发人员管理这个句号会更干净、更容易。

于 2012-05-05T08:07:08.373 回答
3

尽管大卫认为记录可能是唯一可靠的方法是正确的,但您的问题是一个有趣的问题。

您似乎已经编写了将 dll 写入文件的代码,因此问题是响应创建组件时将触发的事件?

如果我要这样做,我想我会检查组件创建是否存在 dll,如果不存在,则在此阶段创建它。你可以动态加载dll吗?如果只能使用静态链接的dll,那么大卫的方式真的是唯一可靠的方式。

于 2012-05-05T08:27:40.537 回答
2

尝试使用 Delphi 的项目管理器将 dll 文件放入Contains您正在创建的包的文件夹中。

在此处输入图像描述

于 2012-07-02T13:57:18.213 回答
2

您所要求的在技术上是可行的,但仅当 DLL 在运行时使用LoadLibrary(). “无法找到组件”错误是在编译时静态链接到 DLL 的结果,这使得无法在运行时提取 DLL(除非静态链接的 DLL 是延迟加载的,它在LoadLibrary()内部使用)。

当且仅当动态/延迟加载 DLL 时,您可以在使用 DLL 之前在运行时从组件的资源中提取它。调用时TResourceStream.CreateFromID(),不要使用全局HInstance变量,FindClassHInstance()而是使用函数。如果组件在启用了运行时包的项目中使用,全局HInstance变量将不会指向组件的模块,但FindClassHInstance()无论组件如何链接到项目,都可以找到正确的模块。

于 2012-05-05T17:31:35.293 回答