[リストへもどる]   [VBレスキュー(花ちゃん)]
一括表示

投稿時間:2006/01/06(Fri) 17:38
投稿者名:moss
Eメール:
URL :
タイトル:
VBからダイアログを持つDLLの呼び出し
VBの問題かVCの問題かわかりませんでしたので、こちらで質問
させていただきます。

VCで作成したダイアログを持つDLLがVCで作成したアプリからは
呼び出せる(ダイアログが表示される)のに、VBから呼び出すと
アプリケーションエラーで終了します。
VBから呼び出すDLLは何度か作成したことはあるのですが、
ダイアログを表示するDLLは作成したことがありません。
DLLの作成に問題があるのか、VBでの呼び出しに問題があるのか
どちらなのでしょうか?

表示されるエラーの内容は以下のとおりです。
For infomation on how your program can cause an assertion
failure, see the Visual C++ documentation asserts.

1.作成するDLLの種類を「MFCの拡張DLL(MFCの共有DLL使用)」で作成開始

2.リソースから「Dialog」を挿入

3.エクスポートした関数に以下を記述

DATA型はユーザー定義
--------------------------------------------------------------------

static AFX_EXTENSION_MODULE hogeDLL = { NULL, NULL };

extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
    ウィザードが作成したソースのまま
}

//以下エクスポートした関数
int WINAPI hoge(DATA *pData)
{
    int rtn;
    TRY
    {
        HINSTANCE    hInstResClient = AfxGetResourceHandle();
        AfxSetResourceHandle( hogeDLL.hModule );

        int        rc;
        ChogeDlg    dlg;    // ダイアログクラス

        //ウィンドウ表示
        rc = dlg.DoModal();

        AfxSetResourceHandle( hInstResClient );

        if ( rc != IDOK ) return( -1 );

        return( 0 );
    }
    CATCH_ALL( e )
    {
        // a failure caused an exception.
        return( -1 );
    }
    END_CATCH_ALL

    return( 0 );
}
--------------------------------------------------------------------

4.呼び出し元VBを作成
標準モジュール
Option Explicit

''データを受け取る際の構造体
Public Type DATA
    aaa As String * 256
    bbb As String * 256
    ccc As String * 256
End Type

Declare Function hoge Lib "hoge.dll" (ByRef pData As DATA) As Long

Form1
Private Sub CmdSearch_Click()
    Dim rtn As Long
    Dim pData As DATA
    
    rtn = hoge(pData)
    
    MsgBox rtn
End Sub

投稿時間:2006/01/06(Fri) 18:00
投稿者名:Blue
Eメール:
URL :
タイトル:
Re: VBからダイアログを持つDLLの呼び出し
たしか、VCのソースのDllMainのなかに(ウィザードが作成したソースのままのとこ)
にコメントらしきものでMFCでないときから呼び出すときはどうするかとか書いてあったような。
(VC++6なら書いてある)

AFX_MANAGE_STATEマクロをつかうとか何とか。

投稿時間:2006/01/06(Fri) 18:09
投稿者名:Blue
Eメール:
URL :
タイトル:
Re^2: VBからダイアログを持つDLLの呼び出し
MFC テクニカル ノート 33
hhttp://www.microsoft.com/japan/msdn/library/default.asp?
url=/japan/msdn/library/ja/vclib/html/_MFCNOTES_TN033.asp
MFC テクニカル ノート 58
hhttp://www.microsoft.com/japan/msdn/library/ja/vclib/html/_MFCNOTES_TN058.asp

ここらへん参考にしてみてください。
分かりにくければ、「AFX_MANAGE_STATE DLL」とかで(Googleとかで)サイト検索してみるとか

投稿時間:2006/01/07(Sat) 10:40
投稿者名:moss
Eメール:
URL :
タイトル:
Re^3: VBからダイアログを持つDLLの呼び出し

Blueさん、ありがとうございました。

ご提示いただきましたページを読んで、スタティックリンクの標準DLL及び、呼び出す関数側で
「AFX_MANAGE_STATE(AfxGetStaticModuleState());」を呼び出した共有DLL共にダイアログを
表示することができました。
もっと内容を良く読んで理解したいと思います。

結局VB側の問題ではなくこちらの掲示板に不適当な内容となりましたことをお詫び申し上げます。