gpt4 book ai didi

c++ - 如何从 VBA 中的 DLL 获取整数值?

转载 作者:行者123 更新时间:2023-11-30 02:26:26 25 4
gpt4 key购买 nike

我想从 VBA 中的 DLL 中获取整数值,如下面的代码。

double _stdcall pll_dll(double* datain0, double* datain1, double* dataout0, double* dataout1, BSTR * str, int* str_len)
{
char buff[128] = { 0 };
char * str0;
char str1[128] = { 0 };

int len;


*dataout0 = *datain0 + 20;
*dataout1 = *datain1 + 30;
len = 30;
*str_len = 30;

str0 = " Nice ";
sprintf(buff, "Hi %s \n", str0);
strcpy(str1, buff);

char* p = str1;
SysReAllocString(str, (OLECHAR*)p);

return 0;
}

VB

Private Declare PtrSafe Function pll_dll Lib "F:\work\pll_dll\x64\Debug\pll_dll.dll" _
(ByRef x_in As Double, ByRef y_in As Double, ByRef x_out As Double, ByRef y_out As Double, ByRef s As String, ByRef str_len As Integer) As Double

Dim s_len As Integer
Call pll_dll(3, 4, d1, d2, s, s_len)

但我无法理解,当我运行上面的代码时,s_len 在 vba 中始终为“0”。但其他参数 double* datain0、double* datain1、double* dataout0、double* dataout1、BSTR * str 都工作正常。

有趣的是,当我摆脱“BSTR * str”参数时当我使用“double _stdcall pll_dll(double* datain0, double* datain1, double* dataout0, double* dataout1, int* str_len)”运行时,我也可以获得 str_len

你能告诉我我应该检查什么吗?如何获取 s_len 值?

最佳答案

您在滥用 SysReAllocString() .

您给它一个 8 位 ANSI 字符串,该字符串仅被类型转换为 16 位指针。它需要一个正确的 16 位 Unicode 字符串。如果去掉类型转换,代码将无法编译,这是有充分理由的。不要使用类型转换来避免编译器错误。

您必须先将输出字符串数据转换为 Unicode,然后才能创建 BSTR

您需要:

  • 使用 MultiByteToWideChar()转换你的最终 char数据到wchar_t .

    double _stdcall pll_dll(double* datain0, double* datain1, double* dataout0, double* dataout1, BSTR * str, int* str_len)
    {
    char c_buff[128] = {0};
    wchar_t w_buff[128] = {0};
    char * str0;
    int len;

    *dataout0 = *datain0 + 20;
    *dataout1 = *datain1 + 30;

    len = 30;
    *str_len = len;

    str0 = " Nice ";
    len = sprintf(c_buff, "Hi %s \n", str0);

    len = MultiByteToWideChar(CP_ACP, 0, c_buff, len, w_buff, 128);

    SysReAllocStringLen(str, w_buff, len);

    return 0;
    }
  • 重写代码以使用swprintf()而不是 sprintf() .

    double _stdcall pll_dll(double* datain0, double* datain1, double* dataout0, double* dataout1, BSTR * str, int* str_len)
    {
    wchar_t buff[128] = {0};
    wchar_t * str0;
    int len;

    *dataout0 = *datain0 + 20;
    *dataout1 = *datain1 + 30;

    len = 30;
    *str_len = len;

    str0 = L" Nice ";
    len = swprintf(buff, L"Hi %s \n", str0);

    SysReAllocStringLen(str, buff, len);

    return 0;
    }

关于c++ - 如何从 VBA 中的 DLL 获取整数值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42850889/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com