VBのプログラムからVC++6.0で作成したDLLを呼び出す方法

[戻る]
近藤 2002/07/26(金) 17:46:57
たびたびすいません。近藤と申します。
以前に、”VC++6.0で内部コマンド(DOSコマンド:DIR)をCALLする方法”では
皆様に大変お世話になりました。

今度の質問は、VC++で作成したDLL(内部コマンドが実行する)をVB6.0から呼び出したいのです
が
なにも動きません。コンパイルはDLL、VB共に通っているのですが・・・・
下記にソースを載せますので、ご教授願います。

*****VC++6.0ソース*****
<<プログラム名:test.cpp>>

#include "stdafx.h"
#include "test.h"
#include "stdlib.h" 
#include "iostream.h"

BOOL APIENTRY DllMain( HANDLE hModule, 
                       DWORD  ul_reason_for_call, 
                       LPVOID lpReserved
                     )
{
    switch (ul_reason_for_call)
    {
        case DLL_PROCESS_ATTACH:
        case DLL_THREAD_ATTACH:
        case DLL_THREAD_DETACH:
        case DLL_PROCESS_DETACH:
            break;
    }
    return TRUE;
}

//int system(const char *string); 

TEST_API int __stdcall fncSub()
{
    cout << "\n    DOSコマンド(Dir)実行です。\n\n\n";
    system("dir");
    return 0;

}

<<プログラム名:test.h>>

#ifdef TEST_EXPORTS
#define TEST_API __declspec(dllexport)
#else
#define TEST_API __declspec(dllimport)
#endif

TEST_API int __stdcall fncSub();

*****VBソース*****
<<プログラム:標準モジュール内に作成>>

Declare Function fncSub Lib "TEST.dll" ()
Sub Main()
    MsgBox ("test")
End Sub

*****その他*****
defファイルの作成(test.def)

LIBRARY TEST.DLL

EXPORTS
 fncSub

全てファイルは、同一フォルダに格納してあります。

不良PG [E-Mail] 2002/07/26(金) 18:00:07
>Declare Function fncSub Lib "TEST.dll" ()
Declare Function fncSub Lib "TEST.dll" () As Long

では?

近藤 2002/07/26(金) 18:02:45
その記述は、あってもなくてもいっしょでした・・・。

不良PG [E-Mail] 2002/07/26(金) 18:09:25
>全てファイルは、同一フォルダに格納してあります。
作成したDLLも同一フォルダに居ますか?

>Sub Main()
>    MsgBox ("test")
>End Sub

作った関数fncSubを呼び出してないようですが・・

近藤 2002/07/26(金) 18:16:50
すべてのソースは同一フォルダに格納してあります。

不良PG [E-Mail] 2002/07/26(金) 18:34:06
>その記述は、あってもなくてもいっしょでした・・・。
いっしょではありません

>すべてのソースは同一フォルダに格納してあります。
DLLは、ソースではありません、オブジェクトです

作った関数fncSubは呼び出しているの?

不良PG [E-Mail] 2002/07/26(金) 18:49:36
>Sub Main()
→   Call fncSub
>    MsgBox ("test")
>End Sub

yas0302 2002/07/26(金) 21:02:26
不良PGさんの指摘されているように、環境を正しく設定してあれば、
実行はされていると思いますよ。(DOS窓の中で。)
一瞬で消えてしまうのでわからないのではないでしょうか。


ためしに、DLLのソースを以下のように変更してください。

TEST_API int __stdcall fncSub()
{
    cout << "\n    DOSコマンド(Dir)実行です。\n\n\n";
//  system("dir");
    system("dirtest.bat");  // <===============
    return 0;
}


そして、DLLがあるフォルダと同じフォルダに
dirtest.bat として以下の内容のファイルを作成してみてください。

dir
pause


ファイル一覧が表示されたあとに、

続行するには何かキーを押してください . . .

と表示されると思います。


でも、なぜ直接VBからコマンドを呼び出さないのでしょうか?
DLLを作成して呼び出すまでもないと思いますが。
ちなみに、VBからは、Shell で起動できます。

dir などは、そのままでは実行できないので
shell "cmd /c dir",1     <=== WinNT / 2K / XP の場合
                              但し一瞬で消えますが。。。。。

古いスレッドには追加発言できません。