3

MSVC++2010で上司用のDLLを作成しました。「シンボルのエクスポート」オプションを指定して「新しいWin32DLL」を選択したので、すべてが完全に標準です。新しいプロジェクトファイル、クラス、そのコンストラクター、偽の値を持つグローバル関数と変数、およびAPIENTRY関数を持つファイルdllmain.cppには、いくつかの事前定義されたエクスポートがあります。まだ何も変更していません。

今、私の上司は彼のVB6プロジェクトでエクスポートされたものを使用したいと思っています。彼はVB6プロジェクトを開始し、メニュー「プロジェクト」-「リンク」(ドイツ語から英語に翻訳されているため、多少異なる場合がありますが、私が何を意味するかはご存知でしょう)を実行し、DLLファイルを選択しました。通常はそうします。

ただし、VB6はそれを含めることができず、代わりに「DLLファイルを含めることができませんでした」というエラーメッセージが表示されます(実際の理由は示されていません)。Visual C ++ 6の標準の新しいDLLプロジェクトでも同じことが起こりました。上司は、シンボルが実際にエクスポートされていないか、VB6に特別な宣言が必要なためだと考えています。誰かが問題が何であるか知っていますか?

4

5 に答える 5

7

ええ、VB6はそのようには機能しません。次のように、VB コードで DLL 関数を宣言する必要があります。

Private Declare Function WinHelp Lib "user32" Alias "WinHelpA" _
  (ByVal hwnd As Long, ByVal lpHelpFile As String, _
  ByVal wCommand As Long, ByVal dwData As Long) As Long

「user32」を「MyCPlusPlusDLL.dll」に置き換え、DLL の実際のメソッド名やシグネチャなどを使用します。次に、DLL を /System フォルダーに配置すると、準備完了です。

注: これは、C++ DLL 内のメソッドが "__declspec" で宣言されていることを前提としています。

于 2011-01-28T15:43:49.913 に答える
2

あなたはすでに答えを受け入れているようですが、これはあなたや他の人に役立つかもしれません。PaulCatonによるUniversalDLLFunction呼び出し元は、アセンブリ言語のブードゥーを使用して、VB6が通常はVB6から呼び出せないさまざまなタイプのDLL関数を呼び出せるようにします。

于 2011-01-28T17:35:55.473 に答える
1

C ++でDLLを作成し、VB6からDLLを使用する最も簡単な方法は、COMを使用することです。

于 2011-01-28T15:34:06.487 に答える
1

通常の DLL の場合、VB 参照は使用できませんが、Declare ステートメントを使用する必要があります。もう 1 つのオプションは、代わりにDLL をActiveX コンポーネントとして作成することです。

于 2011-01-28T15:44:59.163 に答える
1

COM ライブラリでない場合は、C 関数のみを でエクスポートする必要があります__stdcall。それらの .def ファイルを作成する必要がある場合があります (http://msdn.microsoft.com/en-us/library/d91k01sh(VS.80).aspx)。また、depends.exe などの依存関係ウォーカーを使用して、どの関数がどの名前でエクスポートされたかを確認します。

于 2011-01-28T15:44:59.650 に答える