私は C/C++ でのプログラミングが初めてで、Microsoft のヘルプや他の StackOverflow の質問を調べましたが、私の問題に対する答えが見つかりませんでした。
Visual Studio 2008 で作成した DLL からエクスポートされた関数を呼び出そうとしています。この DLL は、VBA マクロおよび LabWindows/CVI で作成されたユーザー インターフェイス プログラムから呼び出されます。VBA マクロでは問題なく動作しますが、読み込もうとすると LabWindows のプログラムがクラッシュします。
静的呼び出しと動的呼び出しの両方を試しました。ここに私が持っているものがあります:
DLL 内の関数は、VBA が使用できるように _stdcall と .def ファイルを削除するために __declspec( dllexport ) という方法でエクスポートされます。
__declspec( dllexport ) double * __stdcall calculos( char * String_inputs);
入力文字列は、非常に長い文字配列です。+60 個の文字列 (各文字列はコンマ "," で区切られています) を渡す方法です。次に、コードでは、コンマ (",") を参照として使用して strtok で分割されます。これは、関数内の VBA の入力制限が 60 であるため必要です。
関数を静的に呼び出そうとすると (.lib ファイルと DLL のヘッダーをプロジェクトに追加する)、次のエラーが発生します。
error: Undefined symbol '_calculos@4' referenced in "c:\PATH\cvibuild.PROJECTNAME\Debug\Main.obj".
静的呼び出しのコードは次のとおりです。
double * array_out; //Pointer to array of double
array_out = calculos(STRING_INPUT);
彼の装飾名で関数を呼び出してみましたが、うまくいきません。
array_out = _calculos@4(STRING_INPUT);
DependencyWalker で関数の名前を確認すると、次の名前が表示されます。
?calculos@@YGPANPAD@Z
関数の呼び出しと定義でも使用してみましたが、成功しませんでした。
私が間違っていることは何ですか?
関数を動的に呼び出そうとすると、プログラムがクラッシュします。DLL、ヘッダー ファイル、および .lib は、プロジェクト フォルダーに配置されます。
typedef double * (*DLLFUNC)(char*); //DLL function prototype
HINSTANCE hinstLib; //Handle to the DLL
DLLFUNC ProcAddress; //Pointer to the function
hinstLib = LoadLibrary("General.dll");
//The the pointer to the exported function and typecast it so that we can easily call it
//DLLFUNC is typedef'ed above
ProcAddress = (DLLFUNC) GetProcAddress(hinstLib, "?calculos@@YGPANPAD@Z");
//Call the function using the function pointer
double * array_out = ProcAddress(STRING_INPUT); //It crashes here
クラッシュしたときにプログラムをデバッグすると、char * のコンマ (",") が '\0' に置き換えられているため、最初の文字列だけが DLL に到達します。それが理由なのかもしれませんが、なぜコンマ (",") が置き換えられているのかわかりません。
また、装飾された名前で呼び出してみましたが、成功しませんでした。
ProcAddress = (DLLFUNC) GetProcAddress(hinstLib, "_calculos@4");//Error -> Dereference to null pointer
ProcAddress = (DLLFUNC) GetProcAddress(hinstLib, "calculos"); //Error -> Dereference to null pointer