Visaul C++ 2005で作成したDLLをVisaul Basic 6.0で呼び出そうとすると呼び出すことができません.呼び出そうとすると,実行時エラー'48' ファイルが見つかりませんというエラーが発生します.Visaul C++ 6.0で作成したDLLなら呼び出せるのですが,なぜでしょうか.そもそも,Visaul C++ 2005で作成したDLLをVisaul Basic 6.0で呼び出すことはできないのでしょうか.参考になりそうなページなどありましたら教えてください.
>Visaul C++ 2005で作成したDLL
どのようにして作成していますか?
まさか、マネージドのDLL(クラスライブラリ)ではないですよね?
(Win32プロジェクトから作成されるDLLでないとDecalre〜では呼べない)
まず,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を置く場所は間違っていないと思うのですが.
宜しくお願いします.
DecalreでDLLをフルパスで指定するとどうなりますか?
参考:http://madia.world.coocan.jp/cgi-bin/VBBBS2/wwwlng.cgi?print+200611/06110025.txt
関数のエントリが見つからないのであれば、DEFファイルを使ってください。
フルパスで指定してもファイルが見つかりませんとなります.
Visual C++ 6.0で作成するとフルパスでできるのですが.
6.0で作るDLLと2005で作るDLLとでは,サイズが異なります.
まったく同じものを作ったのにこれはなぜですか.
6.0のDLLを使うときはフォルダにDLLを置き,標準モジュールを上と同じにすると,実行可能です.
2005のDLLを使うときには特別な処理がいるのでしょうか.
2005のDLLをVisual C++ 6.0では使うことができたので,DLL自体には間違いはないような気がするのですが.
あと,DEFファイルは使用していました.
記述していないですみません.
>6.0で作るDLLと2005で作るDLLとでは,サイズが異なります.
VC2005とVC6とではコンパイルオプションに違いがあります。
たとえば、文字セットはデフォルトでUnicodeになります。
どれだけ、違いがあるかは調べていないのははきりとはわかりません。
今ちょっと、手元にVS2005がないのでなんともいえませんが、
以前VS2005のC++でWin32DLLを作って、VB6で使ったことがありましたが、
何の問題もなくつかえました。
Blueさん,ありがとうございました.
使えるということは,やはりどこかに間違いがあるようなので,調べてみます.
もし何か原因が思いついたら教えてください.
ツイート | ![]() |