別の Pb アプリと .net (2.0) アプリの両方から、Pb (11.5) で生成されたネイティブ Win32 dll にリンクしようとしています。登録された COM オブジェクトが Pb から見えることは承知しています。私がやりたいことは、Pb (11.5 Enterprise を実行している) が COM ではなく、ネイティブの Win32 dll で関数を呼び出すようにすることです。私はまた別の方法に行きたい: Win32 exe (ネイティブと .net の両方) が Pb で生成された dll の関数を呼び出すようにしたい。私は限られた成功を収めてきました。
シナリオ 1: Pb がネイティブの Win32 exe & dll を生成します。
個別の pbl (shared.pbl と呼ばれる) といくつかの単純な関数 (文字列 HelloWorld を返す関数を含む) を含む単純なアプリを作成しました。プロジェクトは、exe と個別の dll にビルドされます。動作します (ボタンをクリックすると、ラベルにテキスト HelloWorld が表示されます)。
別のPb ワークスペースで、ほぼ同一のアプリを作成しますが、shared.pblは作成しません。最初のワークスペースから shared.dll を参照する外部関数を宣言します。
function int GetSystemMetrics( int index ) library "user32.dll";
function int f_rtn_int( int number ) library "shared.dll";
アプリの実行 - GetSystemMetrics() に関連付けられたボタンをクリックすると機能します。2 番目のボタンをクリックして shared.dll にアクセスすると、「外部関数の呼び出しでエラーが発生しました ...」というメッセージが表示されて失敗します。
2 番目のアプリを動作させることができた唯一の方法は、ターゲット プロパティのライブラリ リスト タブに shared.dll を追加することです 。ただし、これにより、dll の内容が生成された exe に埋め込まれているようです。shared.dll を削除すると、2 番目のアプリは問題なく実行されます。
生成された Pb コードに dll が埋め込まれていない状態で、Pb で外部の Win32 dll を参照するにはどうすればよいですか? shared.dll は Pb によって別のワークスペースに生成されたことを思い出してください。
シナリオ 2: .Net exe が Pb で生成された dll にアクセスする
次に、Pb アプリと同等の機能を持つ単純な .net アプリ (.net v2.0、vs2005) を作成しました。私はshared.dllを参照しています:
[DllImport( "user32.dll" )]
static extern int GetSystemMetrics( int smIndex );
[DllImport( "shared.dll" )]
static extern string f_get_hello_world();
HelloWorld 関数を呼び出そうとすると、.net エラーが発生します。
Unable to find an entry point named 'f_get_hello_world' in DLL 'shared.dll'
エディター/逆アセンブラーを使用すると、関数名が "_getVtableInfo_f_get_hello_world@12" に変更されていることがわかりました。宣言でさまざまな命名バリエーションを試し、運が悪いと呼び出しました。
別の言語 (c++、c#) から Pb によって作成されたネイティブの Win32 dll を参照することは可能ですか? もしそうなら、どのように?