丸 1 週間格闘している問題がありますが、自分では解決できません。私はググって、あらゆる種類のフォーラムを検索してきました...「これはうまくいくかもしれない」ということをたくさん見つけて、試してみましたが、うまくいきませんでした。誰か手がかりがあれば、助けてください!
外部ソースから、C++ アプリケーションから使用できるようにする必要がある、VB で記述された多くのクラスと関数を入手しました。私の最初のことは次のとおりです。問題ありません。VB コードを dll に変換し、C++ プログラムからロードします。これは想像以上に大変でした。私の C++ プログラムは Visual Studio で記述されていませんが、簡単にするために、Visual Studio C++ アプリケーションから (Visual Studio 2010 で記述された) VB dll を読み込もうとすることから始めました。これまでの私のコードは次のとおりです。
VB コード : DllModule : クラス ライブラリ プロジェクト
DllModule.vb
Namespace DllModule
Public Module DllModule
Public Const DLL_PROCESS_DETACH = 0
Public Const DLL_PROCESS_ATTACH = 1
Public Const DLL_THREAD_ATTACH = 2
Public Const DLL_THREAD_DETACH = 3
Public Function DllMain(ByVal hInst As Long, ByVal fdwReason As Long,
ByVal lpvReserved As Long) As Boolean
Select Case fdwReason
Case DLL_PROCESS_DETACH
' No per-process cleanup needed
Case DLL_PROCESS_ATTACH
DllMain = True
Case DLL_THREAD_ATTACH
' No per-thread initialization needed
Case DLL_THREAD_DETACH
' No per-thread cleanup needed
End Select
Return True
End Function
'Simple function
Public Function Add(ByVal first As Integer, ByVal sec As Integer) As Integer
Dim abc As Integer
abc = first + sec
Return abc
End Function
End Module
End Namespace
DllModule.def
NAME DllModule
LIBRARY DllModule
DESCRIPTION "My dll"
EXPORTS DllMain @1
Add @2
C++ コード : TryVbDllLoad : コンソール アプリケーション
TryVbDllLoad.cpp
#define WIN32_LEAN_AND_MEAN
#include <Windows.h>
#include <strsafe.h>
extern "C" {
__declspec(dllimport) int __stdcall Add(int, int);
}
typedef int (__stdcall *ptf_test_func_1_type)(int, int);
int __cdecl _tmain(int argc, _TCHAR* argv[])
{
HINSTANCE hdll = NULL;
hdll = LoadLibrary("DllModule.dll"); // load the dll
if(hdll) {
ptf_test_func_1_type p_func1=(ptf_test_func_1_type)GetProcAddress(hdll,"Add");
if(p_func1) {
int ret_val = (*p_func1)(1, 2);
} else {
DWORD dw = GetLastError();
}
FreeLibrary(hdll); // free the dll
} else {
DWORD dw = GetLastError();
}
return 0;
}
dll をロードできますが、GetProcAddess はエラー コード 127 で NULL を返します (指定されたプロシージャが見つかりませんでした)。
VB アプリケーションから dll を読み込もうとしました。これは機能します (.def ファイルがなくても)。しかし、C++ アプリケーションが使用できる適切なエントリ ポイントが作成されていないと推測しています (Dependency Walker で dll を開くと、エントリ ポイントや関数が表示されません)。「COM相互運用に登録」を使用して、または使用せずにVBコードをコンパイルしようとしました。
1) 私は何を間違っていますか?
2) これを適切に解決する良い方法がない場合、dll を作成する代わりに何ができますか? C++ アプリケーションで VB クラスと関数を使用できる他の方法はありますか?
敬具
サラ
ご回答ありがとうございました!
ただし、dll に何らかのエラーがあるはずです。登録しようとすると、regsvr32 を使用しているため、「モジュール C:/tmp/DllModule.dll が読み込まれましたが、DllRegisterServer の開始アドレスが見つかりませんでした。確認してください。 C:/tmp/DllModule.dll は有効な DLL ファイルまたは OCX ファイルであり、再試行してください。」
また、私が使用するとき
#import "C\tmp\DllModule.dll"
私は得る
fatal error C1083: Cannot open type library file: 'c:\tmp\dllmodule.dll'
チュートリアルのリンクを見ましたが、小さな問題があります。すべてのプロジェクト タイプから選択できる「ActiveX DLL」などはありません。はい、私は Visual Studio 2010 Professional を持っています (試用版ですが)。
- サラ