Visual Basic6.0でDLLを呼び出すには


nao  2006-11-16 06:13:25  No: 97201

Visaul C++ 2005で作成したDLLをVisaul Basic 6.0で呼び出そうとすると呼び出すことができません.呼び出そうとすると,実行時エラー'48' ファイルが見つかりませんというエラーが発生します.Visaul C++ 6.0で作成したDLLなら呼び出せるのですが,なぜでしょうか.そもそも,Visaul C++ 2005で作成したDLLをVisaul Basic 6.0で呼び出すことはできないのでしょうか.参考になりそうなページなどありましたら教えてください.


Blue  2006-11-16 07:15:24  No: 97202

>Visaul C++ 2005で作成したDLL
どのようにして作成していますか?
まさか、マネージドのDLL(クラスライブラリ)ではないですよね?
(Win32プロジェクトから作成されるDLLでないとDecalre〜では呼べない)


nao  2006-11-16 21:35:40  No: 97203

まず,Visual C++ 2005でテンプレートを「Win32コンソールアプリケーション」にし,アプリケーションの種類を「DLL」にして作成しました.
DLLのソースを

#include "stdafx.h"
#include "TEST.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;
}

TEST_API int __stdcall fncSub(int a, int b)
{
    return a + b;
}

とし,ヘッダを

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

TEST_API int __stdcall fncSub(int a, int b);

としています.
するとDLLが作成されるので,これをBASICのフォルダにコピーして,
BASICのフォームを

Private Sub Command1_Click()
    Dim a As Long
    Dim b As Long
    a = 2
    b = 3
    MsgBox fncSub(a, b)
End Sub

標準モジュールを

Declare Function fncSub Lib "test.dll" (ByVal a As Long, ByVal b As Long) As Long

として,実行するとファイルが見つかりませんとなるのですが,何か不足しているのでしょうか.
DLLを置く場所は間違っていないと思うのですが.
宜しくお願いします.


Blue  2006-11-16 21:50:04  No: 97204

DecalreでDLLをフルパスで指定するとどうなりますか?

参考:http://madia.world.coocan.jp/cgi-bin/VBBBS2/wwwlng.cgi?print+200611/06110025.txt

関数のエントリが見つからないのであれば、DEFファイルを使ってください。


nao  2006-11-17 00:57:12  No: 97205

フルパスで指定してもファイルが見つかりませんとなります.
Visual C++ 6.0で作成するとフルパスでできるのですが.
6.0で作るDLLと2005で作るDLLとでは,サイズが異なります.
まったく同じものを作ったのにこれはなぜですか.
6.0のDLLを使うときはフォルダにDLLを置き,標準モジュールを上と同じにすると,実行可能です.
2005のDLLを使うときには特別な処理がいるのでしょうか.
2005のDLLをVisual C++ 6.0では使うことができたので,DLL自体には間違いはないような気がするのですが.
あと,DEFファイルは使用していました.
記述していないですみません.


Blue  2006-11-17 01:06:31  No: 97206

>6.0で作るDLLと2005で作るDLLとでは,サイズが異なります.
VC2005とVC6とではコンパイルオプションに違いがあります。
たとえば、文字セットはデフォルトでUnicodeになります。
どれだけ、違いがあるかは調べていないのははきりとはわかりません。

今ちょっと、手元にVS2005がないのでなんともいえませんが、
以前VS2005のC++でWin32DLLを作って、VB6で使ったことがありましたが、
何の問題もなくつかえました。


nao  2006-11-17 01:23:31  No: 97207

Blueさん,ありがとうございました.
使えるということは,やはりどこかに間違いがあるようなので,調べてみます.
もし何か原因が思いついたら教えてください.


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

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






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