3

パラメータとしてtformを使用してdllを作成したいのですが、単純な計画は、そのフォームがdllに渡された場合、コンポーネント名を含むdllファイルの戻り配列です。

tformをパラメータとして渡すことは可能ですか?

4

2 に答える 2

6

Most likely you will have two instances of the VCL in your process, one for the host exe and one for the DLL. And that is one instance too many. The TForm class from your host exe is a different class from the TForm class in your DLL.

The basic rule is that you cannot share VCL/RTL objects across module boundaries unless all modules use the same instance of the VCL/RTL runtime. The way to make that happen is to link to the VCL/RTL using packages.

于 2013-03-02T14:44:23.887 に答える
1

フォームにTMemoがあるフレームワークがあると仮定します。

2つのタイプを宣言します。

type
  PTform                                  = ^TForm;
  TStringArray                            = array of string;

これらをEXEとDLLの両方に表示します

.DPR実装セクション:

procedure dllcomplist(p_pt_form : PTForm;
                  var p_tx_component : TStringArray);
          stdcall;
          external 'dllname.dll';

..。

var
  t_tx_component                          : TStringArray;
  t_ix_component                          : integer;

..。

  Memo1.Lines.Add('Call DLL to return componentlist');
  dllcomplist(pt_form,t_tx_component);
  Memo1.Lines.Add('Result in main program');
  for t_ix_component := 0 to pred(length(t_tx_component)) do
    Memo1.Lines.Add(inttostr(t_ix_component) + '=' + t_tx_component[t_ix_component]);
  setlength(t_tx_component,0);

およびDLLの.DPR

..。

procedure dllcomplist(p_pt_form : PTForm;
                  var p_tx_component : TStringArray);
          stdcall;
var
  t_ix_component                          : integer;
  t_ix_memo                               : integer;
  t_tx_component                          : TStringArray;
begin with p_pt_form^ do begin
  setlength(t_tx_component,componentcount);
  setlength(p_tx_component,componentcount);
  for t_ix_component := 0 to pred(componentcount) do
  begin
    t_tx_component[t_ix_component] := components[t_ix_component].Name;
    p_tx_component[t_ix_component] := components[t_ix_component].Name;
    if components[t_ix_component].ClassName = 'TMemo' then
      t_ix_memo := t_ix_component;
  end;
  Tmemo(components[t_ix_memo]).lines.add('Within DLL...');
  for t_ix_component := 0 to pred(componentcount) do
    Tmemo(components[t_ix_memo]).lines.add(inttostr(t_ix_component) + ' ' 
            + t_tx_component[t_ix_component]);
  Tmemo(components[t_ix_memo]).lines.add('DLL...Done');
  setlength(t_tx_component,0);
end;
end;

..。

exports dllcomplist;

{OK-これは厳密に必要なものよりもはるかに複雑です。私がやっていることは、呼び出し元のプログラムで動的配列を確立し、それをDLLに入力してから、呼び出し元に結果を表示することです。

DLL内のTMemoを検出し、DLL内の同一のダイナミックアレイから呼び出し元からのTMemoにデータを書き込みます-データが同一で​​あることを示すために}

于 2013-03-03T14:03:58.703 に答える