1

64 ビット C# (および C++) アプリケーションで使用するには、32 ビット dll を移行する必要があります。dll はアンマネージ Delphi コードで記述されています。dll を再コンパイルできません。唯一の方法は、プロセス間通信 (IPC) を使用することです。長い間検索しましたが、多くの情報が見つかりませんでした。私が見つけた最良のガイドは、このリンクにあります: Accessing 32-bit DLLs from 64-bit code .

このフォーラムでは非常に頻繁に引用されているため、目標を達成するためにこのガイドに従いました。したがって、ガイドでは、次の 3 つの手順を実行する必要があると説明しています。

1° STEP - 32 ビット DLL をロードして呼び出す COM オブジェクトを実装する 32 ビット コンポーネントを作成し、32 ビット DLL インターフェイスを COM インターフェイスとして公開します。だから私はここで説明したのと同じことをしました(前のリンクから取られた例):

[ComVisible(true), GuidAttribute("137AD71F-4657-4362-B9E4-C6D734F1F530")]
[InterfaceType(ComInterfaceType.InterfaceIsDual)]
public interface IGetMyString
{
   string GetMyString();
}

[ComVisible(true), GuidAttribute("89BB4535-5A89-43a0-89C5-19A4697E5C5C")]
[ProgId("CallPDW.Class1")]
[ClassInterface(ClassInterfaceType.None)]
public class Class1 : IGetMyString
{
    string GetMyString()
    {
      ......
    }
}

次に、.NET COM アセンブリを登録する必要があるため、Regasm.exe を使用する必要がありますが、代わりに、MSI ファイルをビルドして Regasm と同じことを行う Visual Studio のセットアップおよび展開プロジェクトを作成しました。次に、レジストリ エディターを制御し、HKEY を見つけて動作させました。したがって、このステップまではすべて問題ないか、問題ないように見えます。

2° STEP - この COM コンポーネントをアウト プロセス (OOP) 用に構成するには、標準の COM+ OOP アプリケーションを作成します (代理プロセスとして dllhost を使用)。

3° STEP - 元の 32 ビット DLL と同じインターフェイスを実装する 64 ビット ラッパー DLL を作成し、上で作成した COM オブジェクトの COM インターフェイスをインポートし、公開されたインターフェイスへの現在の呼び出しを COM オブジェクト インターフェイスへの呼び出しに変換します。呼び出しパラメーターを転送し、戻り値を受け取り、それらを呼び出し元に委任します。

問題は、2° と 3° の STEP を達成する方法がわからないことです。これについては、Web またはフォーラムで何も見つからないためです。したがって、ステップ 2° と 3° を達成するために助けが必要です。他の投稿などへのリンクもOKです。よろしくお願いします。


その他の情報 (2016 年 12 月 10 日 - 午後 11 時 10 分): この DLL は、次の 2 つのインターフェイスを介してその関数を 32 ビット ネイティブ環境に公開します。1.) 関数ポインターを含む C/C++ ヘッダー (WINAPI*) 2.) .NET P/Invoke とのインターフェース

4

1 に答える 1

3

あなたは正しい軌道に乗っています。Delphi ライブラリのメソッドを公開するために必要な COM 可視ラッパー DLL を作成して登録しました。

x64 プロセスはこの x86 ラッパーを呼び出すことができないため、代理プロセスが必要です。ただし、DLL のサービスをまったく使用しない場合、DLL を本格的なCOM+サーバーに変換することはほとんど意味がありません。

代わりに、ラッパー DLL をデフォルトの COM サロゲートにホストすることをお勧めします。これを行うには、Windows SDK の一部である x86 ベースの OLE/COM オブジェクト ビューアーを呼び出します。[すべてのオブジェクト] ノードを展開し、COM 可視クラスを選択します。そこから「実装」タブに切り替え、「代理プロセスを使用」にチェックを入れます。[レジストリ] タブに切り替えて、[AppID] ノードに[DllSurrogate]エントリが含まれていることを確認します。注: この手順を自動化する必要がある場合は、手動で、またはセットアップ手順を介して、適切な値を自分でレジストリに書き込む必要があります。

これで、x64 ホストから COM 可視ラッパー クラスのインスタンスを作成できるはずです。

于 2016-10-12T19:17:29.790 に答える