4

Delphi の ActiveX コンポーネントを使用して処理されるハードウェアがあります。設計時にそのコンポーネントをフォームにドロップすると、すべて正常に機能します。ただし、実行時に Creat(Self) を使用して動的に作成すると、さらにメソッドを実行すると、mfc100.dll でアクセス違反が発生します。コードは非常に単純です。

uses
  Windows, Messages, ...
  OleCtrls, MG17MotorLib_TLB; // <-- The latter is the hardware driver

type
  TForm1 = class(TForm)
    motorX: TMG17Motor;
    ...
  end;

...

procedure TForm1.FormCreate(Sender: TObject);
begin
  motorX := TMG17Motor.Create(Self);
  motorX.HWSerialNum := 94835472;
  motorX.StartCtrl; // <--- This causes AV in mfc100.dll
end;

TMG17Motor クラスは TOleControl の子孫であり、ハードウェア プロデューサーによって提供されます。

ActiveX オブジェクトの動的な作成を間違えたのでしょうか、それとも TMG17Motor クラスのバグのように見えますか? 設計時にコントロールをフォームにドロップして Create(Self) を使用しないようにすれば、TMG17Motor クラスのオブジェクトをアプリケーションと同じようにチートして作成する方法があるのではないでしょうか?

PS コントロールを動的に作成できるようにしたい理由は、ハードウェア処理のコードをワーカー スレッドに移動したいからです。

4

1 に答える 1

5

ソフトウェアをダウンロードして、何が問題なのかを確認する努力をしました。TMG17Motor はビジュアル コントロールのようです。したがって、問題は、コンポーネントに親ウィンドウがないという事実から生じます。

修正は非常に簡単です。

procedure TForm1.FormCreate(Sender: TObject);
begin
  motorX := TMG17Motor.Create(Self);
  motorX.Parent := Self; // <--- you need this!
  // set other properties...
  motorX.HWSerialNum := 94835472;
  motorX.Align := alclient;
  motorX.StartCtrl;
end;

サンプル スクリーンショット: ここに画像の説明を入力 コードをワーカー スレッドに移動したいと質問で述べていますが、これは視覚的なコントロールであるため、それは不可能です。Thorlabs に連絡して、目的を達成するための他の手段がないかどうかを確認してください...

編集

David がコメントで提案したように、非 VCL ウィンドウとワーカー スレッドで試すことができます。これは ActiveX オブジェクトであるため、必ずワーカー スレッドの Execute メソッドで CoInitialize(nil)/CoUninitialize を呼び出してください。

于 2013-05-12T07:35:18.207 に答える