我是C / C ++编程的新手,虽然我看过微软的帮助,但在其他StackOverflow问题中,我找不到问题的答案。
我正在尝试从我在Visual Studio 2008中创建的DLL调用导出的函数。这个DLL是从VBA宏和LabWindows / CVI中的用户界面程序调用的。它适用于VBA宏,但是当我尝试加载时,LabWindows中的程序崩溃了。
我尝试了两种,静态和动态调用。这就是我所拥有的:
DLL中的函数以这种方式导出,_stdcall因此VBA可以使用它和__declspec(dllexport)来删除.def文件。
__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