从LabWindows / CVI

时间:2016-05-18 12:30:48

标签: c++ dll labwindows

我是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

0 个答案:

没有答案