VBA使用用法 CorelDRAW X6 62bit

'// For CorelDRAW X6-2023  62bit
Public Declare PtrSafe Function i18n Lib "C:\TSP\lyvba.dll" (ByVal str As String, ByVal code As Long) As String

Sub Test_i18n()
  MsgBox i18n("Nodes", 2052)
  MsgBox i18n("Nodes", 1033)
  MsgBox i18n("Preset Property", 2052)
End Sub

C++ 编译 DLL 的源码: 有兴趣的玩的,自己手工敲吧,因为这个有很多坑,只有自己从坑里爬出来才算真掌握

当然代码应该还有BUG,不过能玩就行

在 VBA 中调用 C++ DLL 函数时,需要注意数据类型的兼容性问题。特别是字符串操作,因为在 C++ 中字符串通常是使用字符数组或指针来表示。网上搜了很多方法,也问了GPT,好像没有完全正确的描述。

比如 GPT 说 在 VBA 中,String 类型通常被实现为 Unicode 字符串,即每个字符占用两个字节。如果需要将 VBA 中的 Unicode 字符串传递给 C 语言的 DLL,需要进行一些格式化和类型转换操作,以便使 C 函数能够正确地接受和处理字符串参数。

但是 CorelDRAW X6 VBA 实际 String 是本地字符集的。传入到C++中,需要 BSTR是Microsoft定义的一种字符串数据类型 转接,而又要按 类似 char 单字节处理。

代码中使用(char*)string 直接把 BSTR 转成了 C++ 数据结构

BSTR english;
string key = string((char*)english);

DLL 返回字符串 到VBA,还是使用了单字节的转换函数 CharToBSTR

BSTR CharToBSTR(const char* str)
{
    // 获取char*字符串的长度(以字节为单位)
    int len = strlen(str);

    // 分配BSTR字符串的内存(按字节分配)
    BSTR bstr = SysAllocStringByteLen(nullptr, len);

    // 将char*字符串的内容逐字节复制到BSTR字符串中
    memcpy(bstr, str, len);

    return bstr;
}

现在接口虽然写好了,但是可能会有BUG,只有测试看看,慢慢改成成熟接口。

分类: 学习编程

0 条评论

发表回复

Avatar placeholder

您的邮箱地址不会被公开。 必填项已用 * 标注