ADOBE Acrobat へのプラグインである C++ dll があります。頻繁に (前後に) 対話する必要があり、WPF プロセスに対してかなりの量の複雑なデータ構造を使用します。
何が最善の方法であるかについての考え。少し長期的で保守可能なものが必要です。つまり、両方のプロセスがメソッド呼び出しのように見えるものを作成し、一部のインフラストラクチャ部分がマーシャリングとディスパッチを実行できるようにするためのアイデアが必要です。私はWindowsメッセージを試しましたが、ADOBEでいくつかの競合の問題に遭遇しました.dllがAdobeにCLRをロードさせる原因にもあまり興味がありません. 他に頭に浮かぶのは、名前付きパイプまたは http だけです。
前もって感謝します
3 に答える
私はCOMで行きます:
- WPF アプリにインターフェイスを実装する
- タイプライブラリを生成します (例: を使用
regasm
) - typelib を C++ dll にインポートする
- 伝える
双方向通信が必要な場合、C++ dll は、WPF アプリケーションからアクセスされる COM インターフェイスを実装することもできます。
これは、従来の C++ アプリを新しい .NET サービスに接続するために使用したもので、うまく機能します。最大の問題は、COM を知っている人を見つけることですが、幸いなことに、COM を深く理解している必要はありません。
名前付きパイプでもできますが、関数を呼び出すだけの感覚は得られません。名前付きパイプは非常に低レベルの IPC です。その他の IPC オプションは次のとおりです。
- Windows RPC では、関数を呼び出すだけの感覚が得られます。
- COM オブジェクトを WPF アプリケーションでホストし、それを Adobe プラグインから呼び出すのはどうですか?
COM に関するヒントは非常に興味深いものです。このコンセプトを実践してみました。WPF CallDllFromWpf3Interface プロジェクトでインターフェイスを作成しました。
using System.Runtime.InteropServices;
namespace CallDllFromWpf3Interface
{
[Guid("F6E0E2E8-CCC6-487B-8BF1-261265061E6A")]
public interface SetValueInterface
{
void SetValue(int value);
}
}
次に、regasm ツールを使用して typelib を生成しました: regasm CallDllFromWpf3Interface.exe /tlb
「oleview」ツールを使用すると、typelib とインターフェイスを確認できます。
次のステップは、「CallSetValueInterface」という名前の c++ dll プロジェクトを作成することでした。
CallSetValueInterface.cpp ファイルに次の行を書きました。
#import "D:\Thomas\Programming\WPF\Basics\CallDllFromWpf\CallDllFromWpf3Interface\CallDllFromWpf3Interface\bin\Debug\CallDllFromWpf3Interface.tlb"
void
CallSetValueInterface::startAcq(void)
{
CoInitializeEx(NULL, COINIT_APARTMENTTHREADED);
CallDllFromWpf3Interface::SetValueInterfacePtr Svip("f6e0e2e8-ccc6-487b-8bf1-261265061e6a");
Svip->SetValue(55);
Svip = NULL;
CoUninitialize();
}
dll プロジェクトのビルドが成功した後、「CallSetValueInterface.dll」を「CallDllFromWpf3Interface」プロジェクトにコピーしました。
最後に、WPF コードを次のように変更しました。
#region SetValueInterface Members
public void SetValue(int value)
{
MyValue = value;
}
#endregion
[DllImport("CallSetValueInterface.dll", EntryPoint = "startAcq", ExactSpelling = true, SetLastError = true)]
public static extern void StartAcqFromDll();
private void Button_Click(object sender, RoutedEventArgs e)
{
StartAcqFromDll();
}
また、デバッガーが StartAcqFromDll() に到達すると、「CallDllFromWpf3Interface.exe で 'System.Runtime.InteropServices.SEHException' の未処理の例外が発生しました」というエラー ダイアログが表示されました。
何がうまくいかないのか誰か知っていますか?
よろしく、
トーマス・L.