4

私はでコンポーネントを開発してdelphi 7おりdelphi 2006、コンポーネントはアプリケーションディレクトリにファイルが存在.pas する必要がある(私のものではない)ファイルを使用しています。DLL

ファイルをコンポーネントに埋め込むことができるDLLので、ユーザーがフォームにファイルをドロップするか、実行時にファイルを作成するとDLL、アプリケーション ディレクトリに配置されますか?

現在

DLL1)アプリケーション ディレクトリにファイルを配置するようにユーザーに指示しています。

2) Resources にファイルを追加して、作成時にアプリケーションディレクトリにDLLドロップできるようにしますか? delphidabbler_embed_resourceDLLから。これは私が使用した

   {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}取得し、その場所にドロップしますが、

DropDllToApplicationDirectOryコンポーネントをフォームにドロップしたときにこれを呼び出すにはどうすればよいですか?

コンポーネントを試しinitializationてみましたが、DLL がコピーされていないため、エラーが発生します ここに画像の説明を入力

EDIT このフォームで時計の実行をドロップすると、時計が実行され始めます(現在の時刻を表示します)...だから私はこれを試しましRXControlsTRxClock

 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

3

文書化がおそらく唯一の信頼できるアプローチであるという David の意見は正しいですが、あなたの質問は興味深いものです。

dll をファイルに書き込むコードを作成したように見えるので、問題はコンポーネントの作成時に発生するイベントに応答していますか?

これを行う場合、コンポーネントの作成時にdllが存在することを確認し、そうでない場合はこの段階で作成すると思います。dll を動的にロードすることは可能ですか? 静的にリンクされた dll しか使用できない場合、David の方法が本当に唯一の信頼できる方法です。

于 2012-05-05T08:27:40.537 に答える
2

ContainsDelphi の Project Manager を使用して、作成中のパッケージのフォルダに dll ファイルを配置してみてください。

ここに画像の説明を入力

于 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 に答える