初めてdllに挑戦していますが、VB, Accessから呼び出すと
正常に動作する時とエラーになる時があります。
VC:.NET2003
VB:.NET2003
ACCESS:2003 です。
(VC側)
extern "C" __declspec(dllexport) void __stdcall Dll_TestMessageBox();
extern "C" __declspec(dllexport) void __stdcall Dll_TestMessageBox(CString str)
{
CString s = str; -------> (A)
AfxMessageBox(s);
}
(VB, ACCESS側)
Declare Sub Dll_TestMessageBox Lib "D:\xxx\yyy\DllTest.dll" (ByVal a As String)
Call Dll_TestMessageBox("123")
VB、ACCESS共にメッセージボックスは表示されません。
(A)を
CString& s = str;
にすると、VB、ACCESS共にメッセージボックスは表示され、正常終了します。
ちなみに(A)を最初のままでVCで呼び出すと
typedef void (__stdcall *DISPLAYMESSAGE)(CString);
HINSTANCE hDllInstance;
DISPLAYMESSAGE Dll_TestMessageBox; // 関数アドレス
hDllInstance = ::LoadLibrary("D:\\xxx\\yyy\\DllTest.dll");
if( hDllInstance != NULL )
{
Dll_TestMessageBox = (DISPLAYMESSAGE)(::GetProcAddress(hDllInstance, "Dll_TestMessageBox"));
if( Dll_TestMessageBox != NULL )
Dll_TestMessageBox("123");
}
FreeLibrary(hDllInstance);
メッセージボックスは表示され、正常終了します。
VCとVB、ACCESSの違いはどこにあるのでしょうか?
よろしくお願いします。
これVBの掲示板でも見たような気がする。
VB(非MFCの環境)から、インタフェースとして(引数や戻り値に)MFCの型を使うのは不味いのではないかと思う。
素直に、LPCTSTRで受け渡して、もらったものをCString型に格納しましょう。
extern "C" __declspec(dllexport) void __stdcall Dll_TestMessageBox(LPCTSTR str)
{
CString s(str);
AfxMessageBox(s);
}
ちなみに、Ref str As Stringだと、BSTR*で受けることになります。
Blueさん、返事が遅くなってすみません。
確かにBlueさんのやり方だとエラーにはならないのですが、
CString s = str;
が問題ではなく、引数CString strが問題でしょうか?
dllの中でMFCは使用できるが引数(戻り値も)は対応した型を使用する
(http://www.sanryu.net/acc/howtoapi.htmを参照しました。)
ということでしょうか?
よろしくお願いします。
>引数CString strが問題でしょうか?
そうです。
>dllの中でMFCは使用できるが引数(戻り値も)は対応した型を使用する
そういうことです。
ありがとうございました。
スッキリ、スッキリです。
ツイート | ![]() |