VC作成dllをVB, ACCESSから呼び出すには?

解決


matsu  2006-11-09 17:22:37  No: 63544

初めて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の違いはどこにあるのでしょうか?

よろしくお願いします。


Blue  2006-11-09 17:46:07  No: 63545

これ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*で受けることになります。


matsu  2006-11-11 06:52:13  No: 63546

Blueさん、返事が遅くなってすみません。

確かにBlueさんのやり方だとエラーにはならないのですが、
CString s = str;
が問題ではなく、引数CString strが問題でしょうか?
dllの中でMFCは使用できるが引数(戻り値も)は対応した型を使用する
http://www.sanryu.net/acc/howtoapi.htmを参照しました。)
ということでしょうか?

よろしくお願いします。


Blue  2006-11-11 07:07:16  No: 63547

>引数CString strが問題でしょうか?
そうです。

>dllの中でMFCは使用できるが引数(戻り値も)は対応した型を使用する
そういうことです。


matsu  2006-11-11 07:30:11  No: 63548

ありがとうございました。

スッキリ、スッキリです。


※返信する前に利用規約をご確認ください。

※Google reCAPTCHA認証からCloudflare Turnstile認証へ変更しました。






  このエントリーをはてなブックマークに追加