Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/126.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ VBA/Excel和C++;DLL,特别是字符串问题_C++_Vba_Excel_Dll_Bstr - Fatal编程技术网

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

C++ VBA/Excel和C++;DLL,特别是字符串问题,c++,vba,excel,dll,bstr,C++,Vba,Excel,Dll,Bstr,我正在从事Excel和Arduino之间串行通信的项目。以下是我在VBA中用于读取Arduino数据的内容,这就是我的问题所在 Private将函数readFromSerialPort库“C:PathToDll.dll”(ByRef缓冲区作为字符串)声明为字符串 在VBA中的循环函数中,我有以下内容,将单元格值设置为作为缓冲区的字符串 BigData.Range("Buf").Value = "B " 另一

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

Private将函数readFromSerialPort库“C:PathToDll.dll”(ByRef缓冲区作为字符串)声明为字符串
在VBA中的循环函数中,我有以下内容,将单元格值设置为作为缓冲区的字符串

BigData.Range("Buf").Value = "B                                            "
另一个名为dataWindow的单元格接受Buf作为参数,因此在调用该参数时会进行更新

=readFromSerialPort(Buf)

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

DLL\u导出BSTR WINAPI readFromSerialPort(LPBSTR bufferTemp){
char errorMsg[]=“读取失败”;
char mbstring[最大字符串大小];
BSTR wcstring=*bufferTemp;
int sLen=wcstombs(mbstring,wcstring,最大字符串大小);
char charString[最大字符串大小];
DWORD-dwBytesRead=0;
if(hSerial==无效的句柄值){
ErrorExit(“读取文件(端口未打开)”;
int wLen2=mbstowcs(*bufferTemp,ERRORSMSG,strlen(ERRORSMSG));
返回*缓冲温度;
}
if(!ReadFile(hSerial、charString、sLen和dwBytesRead,NULL)){
错误退出(“读取文件”);
int wLen2=mbstowcs(*bufferTemp,ERRORSMSG,strlen(ERRORSMSG));
返回*缓冲温度;
}
int wLen2=mbstowcs(*bufferTemp,字符串,sLen);
返回*缓冲温度;
}

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

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

GSerg解决了这个问题。我不知道VBA在作为字符串传递时会自动转换,因此在DLL中我不是处理BSTR,而是处理ASCII char*或LPSTR。另外,由于excel中的一个错误,从单元格中调用函数并不能实现这种转换。

有趣的是,我只是回答了一个我偶然发现的老问题。同样有趣的是,我刚刚找到了你的帖子,想知道如何与你联系以查看此帖子。你的帖子帮助我理解了为什么它们在单元格中工作而不是在Dll中工作,但我想我真的在问,既然我在Dll的READFILE中需要一个PVOID,那么将字符串从VBA发送到Dll的最简单方法是什么,这样我就可以将该字符串更改为我从读取中接收到的信息并将其发送回。我应该使用LPSR来做吗?通常在VBA中,你可以将参数<代码> ByVal < /Cux>代码>作为字符串,在调用将充当缓冲区的函数之前分配字符串(例如,<代码> S=字符串(0, 250)< /C> >,在C++侧使用<代码> LpSTR < /Cord>,然后它将双向工作。如果我想传递一个字符串数组呢?并在DLL中对它们进行迭代。我已经发布了一个问题,标题是:如何在VBA/Excel中创建一个字符串数组,并把它发送到一个C++ DLL,以便它可以在DLL中进行。有趣的是,我只是回答了一个我偶然发现的老问题。同样有趣的是,我刚刚找到了你的帖子,想知道如何联系你来查看这篇帖子。你的帖子帮助我理解了为什么它们在单元格中工作而不是在Dll中工作,但我想我真的在问,既然我在Dll的READFILE中需要一个PVOID,那么将字符串从VBA发送到Dll的最简单方法是什么,这样我就可以将该字符串更改为我从读取中接收到的信息并将其发送回。我应该使用LPSR来做吗?通常在VBA中,你可以将参数<代码> ByVal < /Cux>代码>作为字符串,在调用将充当缓冲区的函数之前分配字符串(例如,<代码> S=字符串(0, 250)< /C> >,在C++侧使用<代码> LpSTR < /Cord>,然后它将双向工作。如果我想传递一个字符串数组呢?并在DLL中对它们进行迭代。我已经发布了一个问题,标题是:如何在VBA/Excel中创建一个字符串数组,并把它发送到一个C++ DLL,以便它可以在DLL中进行。