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 中的错误,从单元格内调用函数不会执行此转换。
我正在研究 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 中的错误,从单元格内调用函数不会执行此转换。