2

私が作成した Windows DLL を C/C++ で作成しました (エクスポートされた関数はすべて「C」です)。DLL は VC++ で問題なく動作します。私は DLL を、すべての開発を VB で行っている別の会社に渡しました。関数へのリンクに問題があるようです。私は 10 年間 VB を使用しておらず、インストールさえしていません。何が問題なのですか?

すべてのパブリック関数を次のように宣言しました。

#define MYDCC_API __declspec(dllexport)


MYDCCL_API unsigned long MYDCC_GetVer( void);
.
.
.

何か案は?


最後に、今日これに戻り、機能するようにしました。答えは私を正しい軌道に乗せましたが、これが最も役立つことがわかりました:

http://www.codeproject.com/KB/DLL/XDllPt2.aspx

また、文字列を DLL 関数に渡す際にいくつかの問題がありましたが、これが役に立ちました。

http://www.flipcode.com/archives/Interfacing_Visual_Basic_And_C.shtml


4

3 に答える 3

4

for exportを使用することにより__declspec、関数名はエクスポートされてマングルされます。つまり、C ++コンパイラがオーバーロードを解決するのに役立つ型情報が含まれます。

VB6 はマングルされた名前を処理できません。回避策として、名前をデマングルする必要があります。最も簡単な解決策は、VC++のエクスポート定義ファイルを使用して DLL ファイルをリンクすることです。エクスポート定義ファイルは非常に単純で、DLL の名前とエクスポートされた関数のリストが含まれているだけです。

LIBRARY mylibname
EXPORTS
    myfirstfunction
    secondfunction

さらに、stdcallVB6 が処理できる唯一の呼び出し規約であるため、呼び出し規約を指定する必要があります。アセンブリ インジェクションを使用して C 呼び出しを処理するプロジェクトがありますが、この難しくてエラーが発生しやすい方法を使用したくないと思います。

于 2008-09-02T13:16:15.530 に答える
3

最後に __stdcall を追加してみてください

#define MYDCC_API __declspec(dllexport) __stdcall

古い VB6 アプリとやり取りする C++ dll がいくつかあり、それらはすべて最後にそれを持っています。

于 2008-09-02T13:16:30.257 に答える
0

VB6 DLL は常に COM dll です。できるだけ短い言葉で例を説明します。以下に示すようなメソッドを含む CTest というクラスを持つ VB6 の ActiveX DLL プロジェクトがあるとします。

Public Function vbConcat(ByVal a As String, ByVal b As String) As String vbConcat = a & b End Function

VB6 プロジェクト プロパティでプロジェクト名を VBTestLib として設定し、プロジェクトを F:\proj\VB6\ActiveXDLL\VBTestDLL.dll としてコンパイルしました。

Windows コマンド regsvr32 F:\proj\VB6\ActiveXDLL\VBTestDLL.dll を使用して dll を登録する必要があります。

今あなたのC++コード:

#名前空間 VBTestLib を使用して "F:\proj\VB6\ActiveXDLL\VBTestDLL.dll" をインポートします。

ボイド CDialogTestDlg::OnButton1() {

 HRESULT hresult;
 CLSID clsid;
 _CTest *t; // a pointer to the CTest object
 _bstr_t bstrA = L"hello";
 _bstr_t bstrB = L" world"; 
 _bstr_t bstrR;
 ::CoInitialize(NULL);
  hresult=CLSIDFromProgID(OLESTR("VBTestLib.CTest"), &clsid);
  hresult= CoCreateInstance(clsid,NULL,CLSCTX_INPROC_SERVER,
                               __uuidof(_CTest),(LPVOID*) &t);
  if(hresult == S_OK)
  {
     bstrR  = t->vbConcat(bstrA , bstrB);
     AfxMessageBox((char*)bstrR);
   }

}

開始するには、これですべてです。

于 2010-04-30T06:11:19.330 に答える