VBA/Excel,和 C++ DLL,特别是字符串问题

VBA/Excel, and C++ DLL, specifically problems with strings

我正在研究 Excel 和 Arduino 之间的串行通信项目。以下是我在 VBA 中用于从 Arduino 读取数据的内容,这是我的问题所在。

Private Declare Function readFromSerialPort Lib "C:PathToDll.dll"(ByRef Buffer As String) As String

在我的 VBA 中的循环函数中,我有以下将单元格值设置为字符串的缓冲区。

BigData.Range("Buf").Value = "B                                            "

另一个名为 dataWindow 的单元格接受 Buf 作为参数,因此它会在调用时更新。

=readFromSerialPort(Buf)

这是 DLL 另一端的 C++ 代码。

DLL_EXPORT BSTR WINAPI readFromSerialPort(LPBSTR bufferTemp) {
char errorMsg[] = "read failed";
char mbstring[MAX_STRING_SIZE];
BSTR wcstring = *bufferTemp;
int sLen = wcstombs(mbstring,wcstring,MAX_STRING_SIZE);

char charString[MAX_STRING_SIZE];
DWORD dwBytesRead = 0;

if (hSerial == INVALID_HANDLE_VALUE) {
    ErrorExit("ReadFile (port not open)");
    int wLen2 = mbstowcs(*bufferTemp,errorMsg,strlen(errorMsg));
    return *bufferTemp;
}

if(!ReadFile(hSerial, charString, sLen, &dwBytesRead, NULL)) {
    ErrorExit("ReadFile");
    int wLen2 = mbstowcs(*bufferTemp,errorMsg,strlen(errorMsg));
    return *bufferTemp;
}

int wLen2 = mbstowcs(*bufferTemp,charString,sLen);
return *bufferTemp;
}

问题是当从单元格调用时这有效,但当我将其更改为在 VBA 中声明字符串并从那里调用读取时无效。

GSerg 已经解决了这个问题。我不明白 VBA 在作为字符串传递时会自动转换,因此在 DLL 中我不是在处理 BSTR,而是在处理 ASCII char* 或 LPSTR。此外,由于 excel 中的错误,从单元格内调用函数不会执行此转换。