Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/excel/25.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ Excel中错误的DLL调用约定_C++_Excel_Vba - Fatal编程技术网

C++ Excel中错误的DLL调用约定

C++ Excel中错误的DLL调用约定,c++,excel,vba,C++,Excel,Vba,我已经尝试了这里发布的技巧(至少是我找到的那些),但我似乎仍然无法摆脱可怕的“坏DLL调用约定”错误。这是我的(非常简单)C++代码: VRTTCONVERSION_API long controlVTT(BYTE controlVal, BYTE valueVal) { LPSTR controlStr = new char[256]; PCHAR convstrout = new char[256]; if (controlVal == 1) { c

我已经尝试了这里发布的技巧(至少是我找到的那些),但我似乎仍然无法摆脱可怕的“坏DLL调用约定”错误。这是我的(非常简单)C++代码:

VRTTCONVERSION_API long controlVTT(BYTE controlVal, BYTE valueVal)
{
    LPSTR controlStr = new char[256];
    PCHAR convstrout = new char[256];

    if (controlVal == 1) {
        controlStr = "Ping";
    }else if (controlVal == 2) {
        controlStr = "0 Init Tool Default";
    }
    if (bGetGeneralAccessFunctionPointer()) {
        return (pGeneral)(controlStr, convstrout, 256);
    }
    else {
        printf("failed to acquire function pointer.\n");
        return -1;
    }
}
这应该接受字节作为输入,并返回一个长字符。我知道返回是有效的,因为我有另一个函数,它不接受任何输入,返回long值,而且这个函数工作得很好

下面是VBA代码(同样简单):

我知道#4别名是正确的(通过使用DLL导出查看器)。当我从另一个C++函数调用它时,这个函数也是有效的(参见下面):


显然,我不是一个专业的程序员,我可能缺少一些基本的东西,但我真的被卡住了;PCHAR convstrout=新字符[256];如果(controlVal==1){controlStr=“Ping”这是一个巨大的内存泄漏。你不能通过学习它来学习C++或者猜什么是正确的。如果你不正确地学习语言,那么上面的错误很容易做。我只是想通过现在的DLL调用错误。我会从一些懂C++的人那里得到内部帮助,比我做的更好。一旦我能够从Excel内部运行DLL,这是我需要克服的第一个障碍。什么是“VRTTCONVERSION_API”?这是否意味着
stdcall
cdecl
,等等?这是解决问题的重点。不管是什么,VBA函数必须具有相同的调用约定。这基本上就是它的简而言之。它是u declspec(dllexport)因此,调用约定在C++中没有给出的是<代码> CDECL < /C> > VBA函数使用了<代码> CDECL < /Cult>调用约定吗?如果VBA不能调用<代码> CDECL < /C>函数,则需要更改C++代码添加<代码>(controlVal==1){controlStr=“Ping”这是一个巨大的内存泄漏。你不能通过学习它来学习C++或者猜什么是正确的。如果你不正确地学习语言,那么上面的错误很容易做。我只是想通过现在的DLL调用错误。我会从一些懂C++的人那里得到内部帮助,比我做的更好。一旦我能够从Excel内部运行DLL,这是我需要克服的第一个障碍。什么是“VRTTCONVERSION_API”?这是否意味着
stdcall
cdecl
,等等?这是解决问题的重点。不管是什么,VBA函数必须具有相同的调用约定。这基本上就是它的简而言之。它是u declspec(dllexport)因此,调用约定在C++中没有给出的是<代码> CDECL < /C>。VBA函数使用了<代码> CDECL < /Cult>调用约定吗?如果VBA不能调用<代码> CDECL < /C>函数,则需要更改C++代码以添加<代码>
Public Declare PtrSafe Function controlVTT Lib "VRTTConversionDLL.dll" Alias "#4" (ByVal controlVal As Byte, ByVal valueVal As Byte) As Long

Sub testControl()

Dim retval As Long
Dim bFunc As Byte
Dim bVal As Byte

bVal = 0
bFunc = 1

retval = controlVTT(bFunc, bVal)
MsgBox retval
bFunc = 2
retval = controlVTT(bFunc, bVal)
MsgBox retval    
End Sub
int main()
{
    long retVal;
    retVal = controlVTT(1, 0);
    printf("Return: %08X \n", retVal);
    retVal = controlVTT(2, 0);
    printf("Return: %08X \n", retVal);
    return 0;   return 0;
}