gpt4 book ai didi

c - 在 C 中处理 MacOSX 上的 BSTR

转载 作者:太空宇宙 更新时间:2023-11-04 03:02:15 26 4
gpt4 key购买 nike

当从 MacOSX dylib 从 VBA 调用 C 代码时,我用 C 编写了一些代码来转换从 VBA 传递的字符串。我得到了一些很好的提示 here ,因为我只关心 ASCII 字符串,所以我编写了以下函数将 BSTR 转换为简单的 char*:

#include <stdlib.h>
#include <stdio.h>
#include <stdint.h>
#include "myheader.h"

size_t vbstrlen(BSTR *vbstr)
{
size_t len = 0U;
while(*(vbstr++)) ++len;
len = len*2;
return len;
}

void vbstochr(BSTR *vbstr, char** out)
{
int len2 = vbstrlen(vbstr);
char str[len+1];

int i;

for(i = 0; i < len; i++)
{
str[i] = (char) (((uint16_t*) vbstr)[i]);
}

str[i] = '\0';

asprintf(out, str);
}

int test(BSTR *arg1)
{
char* convarg;
vbstochr(arg1, &convarg);

return 1;
}

myheader.h 看起来像这样:

typedef uint16_t OLECHAR;
typedef OLECHAR * BSTR;

.我使用 uint16_t 因为 MacOSX C 编译器中的 4 字节(不是 2 字节)wchar_t。我在调用 vbstochar 后添加了一个断点以查看 convarg 的内容,从 Excel 调用时它似乎可以工作。

所以这是有效的,但我不明白的一件事是为什么我必须将 vbstrlen 函数中的 len 乘以 2。我是 C 的新手,所以我不得不稍微阅读一下指针——我想既然我的 BSTR 包含 2 个字节的字符,我应该得到正确的字符串长度而不必乘以 2?如果有人可以向我解释这一点,或者发布教程链接,那就太好了?

此外,我的带字符串参数的函数在 VBA 中调用时有效,但仅在第一次调用后有效。因此,当我第一次从 dylib 调用带有 BSTR* 参数的函数时(在我启动应用程序后,在本例中为 Excel),BSTR* 指针只是指向某个(随机?)地址,但不是字符串。当我第二次从 VBA 调用该函数时,一切正常 - 知道为什么会这样吗?!

最佳答案

BSTR有内嵌长度,不需要手动计算长度。

至于需要将长度乘以2,那是因为一个BSTR使用2个字节的字符,而char只有1个字节。您编写了 vbstrlen() 函数以返回 BSTR 中的字节数,而不是字符数。

由于您只对 ASCII 字符串感兴趣,因此可以将代码简化为以下内容:

#include <stdlib.h> 
#include <stdio.h>
#include <stdint.h>
#include "myheader.h"

size_t vbstrlen(BSTR *vbstr)
{
if (vbstr)
return *(((uint32_t*)vbstr)-1);
return 0;
}

void vbstochr(BSTR *vbstr, char** out)
{
size_t len = vbstrlen(vbstr);
char str[len+1] = {0};

for(size_t i = 0; i < len; ++i)
str[i] = (char) vbstr[i];

asprintf(out, str);
}

关于c - 在 C 中处理 MacOSX 上的 BSTR,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10081590/

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