質問
C/C++ で書かれた Windows DLL を持っています (エクスポートされた関数はすべて「C」です)。DLL は VC++ で正常に動作します。この DLL は、すべての開発を VB で行う別の会社に渡しました。関数へのリンクに問題があるようです。私は VB を 10 年間使っていませんし、インストールすらしていません。何が問題なのでしょうか?
すべてのパブリック関数を次のように宣言しました。
#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
解決
を使用することで __declspec
エクスポートの場合、関数名がエクスポートされます めちゃくちゃな, 、つまりC++ コンパイラがオーバーロードを解決するのに役立つ型情報が含まれています。
VB6 は壊れた名前を処理できません。回避策として、名前のマングルを解除する必要があります。最も簡単な解決策は、 エクスポート定義 VC++のファイル。エクスポート定義ファイルは非常に単純で、DLL の名前とエクスポートされた関数のリストが含まれているだけです。
LIBRARY mylibname
EXPORTS
myfirstfunction
secondfunction
さらに、次のように指定する必要があります。 stdcall
呼び出し規約は、VB6 が処理できる唯一の呼び出し規約であるためです。C 呼び出しを処理するためにアセンブリ注入を使用するプロジェクトがありますが、この難しくてエラーが発生しやすい方法は使いたくないのでしょう。
他のヒント
最後に __stdcall を追加してみてください
#define MYDCC_API __declspec(dllexport) __stdcall
古い VB6 アプリと対話する C++ DLL がいくつかあり、それらはすべて最後にそれを持っています。
VB6 DLL は常に COM DLL です。例をできるだけ少ない言葉で説明します。VB6 に、以下に示すメソッドを含む CTest というクラスを含む ActiveX DLL プロジェクトがあるとします。
パブリック関数vbconcat(byval a as string、byval b as string)as string vbconcat = a&b end関数
また、プロジェクト名をVB6プロジェクトプロパティのVBTESTLIBとして設定し、プロジェクトをF: proj vb6 Activexdll vbtestdll.dllとしてコンパイルしました
Windowsコマンドregsvr32 f: proj vb6 activexdll vbtestdll.dllを使用してDLLを登録する必要があります
今あなたのC++コード:
#import "f: proj vb6 activexdll vbtestdll.dll" namespace vbtestlibを使用。
void 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);
}
}
始めるにはこれですべてです。