0

別の 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 を参照することは可能ですか? もしそうなら、どのように?

4

2 に答える 2

2

基本的に、あなたはしません。COM オブジェクト プロジェクトを作成するか、11 または 11.5 で .NET アセンブリを作成できます。「ネイティブ」生成によって作成された DLL は標準の Windows DLL ではないため、通常の DLL メソッドで呼び出すことはできません。

幸運を、

テリー。

于 2008-12-11T05:18:53.383 に答える
0

Pb が関数定義で「extern C」に従う場合、それらはマングルされていない名前でエクスポートする必要があります。

dll を削除してもプログラムがまだ実行されているように見える理由についての他の質問については、わずかな推測しかできません。何らかのツールが dll の別のコピーを作成し、それがまだ存在するかどうかを確認してください。

于 2008-12-11T05:28:12.007 に答える