BSTR 值未从 C++/CLI DLL 正确返回到 Excel
BSTR value not being returned correctly to Excel from C++/CLI DLL
我正在 Visual Studio 2010 年编写一个 C++CLI DLL,我希望将 return 一个字符串 Excel VBA:
BSTR __stdcall fnGetData (const double *yr, const double *mon, const char *uid, const char *pwd)
我有这个功能,除了当 returned 到 Excel 时字符串最终被截断。下面代码中的两个 MessageBoxA 调用都显示正确的数据(一个巨大的消息框对话框中的所有 8760 个字符)但是 Excel 中生成的 MsgBox 仅显示这 8760 个中的前 998 个字符。此函数的整个代码块如下如下:
BSTR __stdcall fnGetData (const double *yr, const double *mon, const char *uid, const char *pwd) {
//convert Excel ByRef arguments to useable values
string userid(uid);
string passwd(pwd);
int year = *yr;
int month = *mon;
//transform user and pwd to String
System::String ^ UserName = gcnew String(userid.c_str());
System::String ^ PassWord = gcnew String(passwd.c_str());
//call the HTTPWebRequest/Response function on the class
htGetData2 ^ h2 = gcnew htGetData2();
const char* vCharArray = h2->GetStuff(year, month, UserName, PassWord);
//up to this point everything has worked fine
MessageBoxA(0, vCharArray, "hi1 from fnGetData", MB_OK | MB_ICONINFORMATION);
int retValLen = char_traits<char>::length(vCharArray);
//retValLen is 8760
BSTR retVal = SysAllocStringByteLen(vCharArray, retValLen);
int retValLen2 = SysStringLen(retVal);
//retValLen2 is 4380
MessageBoxA(0, (LPCSTR)retVal, "hi2 from fnGetData", MB_OK | MB_ICONINFORMATION);
return retVal;
}
Excel 中的 BSTR/String 不是 vCharArray 字符串中数据的全部内容,我做错了什么?我没有使用 ATL 或 MFC,我应该重试吗?
ExcelVBA调用是:
Private Declare Function GetData Lib "getpdata.dll" (ByRef year As Double, ByRef month As Double, ByRef uid As Byte, ByRef pwd As Byte) As String
在您的 excel 的 VBA 中编写一个调用导出的 GetData 函数的中间函数应该可以解决问题。
类似于:
Private Declare Function GetData Lib "getpdata.dll" (ByRef year As Double, ByRef month As Double, ByRef uid As Byte, ByRef pwd As Byte) As String
Function GetDataEx(ByRef year As Double, ByRef month As Double, ByRef uid As Byte, ByRef pwd As Byte) As String
GetDataEx = GetData(year, month, uid, pwd)
End Function
在您的 excel 中,使用中间函数代替原始导出函数。
好的,我一直在使用Excel VBA MsgBox函数来读取从DLL返回的字符串,而我一直在编写DLL。直到现在我才知道 MsgBox 有 1024 个字符的限制,并且会忽略之后的字符。实际上正在返回完整的字符串,但我假设 MsgBox 显示的是它的完整长度(因为我一直在获取超过前 230 个字符的数据时遇到问题)。
我正在 Visual Studio 2010 年编写一个 C++CLI DLL,我希望将 return 一个字符串 Excel VBA:
BSTR __stdcall fnGetData (const double *yr, const double *mon, const char *uid, const char *pwd)
我有这个功能,除了当 returned 到 Excel 时字符串最终被截断。下面代码中的两个 MessageBoxA 调用都显示正确的数据(一个巨大的消息框对话框中的所有 8760 个字符)但是 Excel 中生成的 MsgBox 仅显示这 8760 个中的前 998 个字符。此函数的整个代码块如下如下:
BSTR __stdcall fnGetData (const double *yr, const double *mon, const char *uid, const char *pwd) {
//convert Excel ByRef arguments to useable values
string userid(uid);
string passwd(pwd);
int year = *yr;
int month = *mon;
//transform user and pwd to String
System::String ^ UserName = gcnew String(userid.c_str());
System::String ^ PassWord = gcnew String(passwd.c_str());
//call the HTTPWebRequest/Response function on the class
htGetData2 ^ h2 = gcnew htGetData2();
const char* vCharArray = h2->GetStuff(year, month, UserName, PassWord);
//up to this point everything has worked fine
MessageBoxA(0, vCharArray, "hi1 from fnGetData", MB_OK | MB_ICONINFORMATION);
int retValLen = char_traits<char>::length(vCharArray);
//retValLen is 8760
BSTR retVal = SysAllocStringByteLen(vCharArray, retValLen);
int retValLen2 = SysStringLen(retVal);
//retValLen2 is 4380
MessageBoxA(0, (LPCSTR)retVal, "hi2 from fnGetData", MB_OK | MB_ICONINFORMATION);
return retVal;
}
Excel 中的 BSTR/String 不是 vCharArray 字符串中数据的全部内容,我做错了什么?我没有使用 ATL 或 MFC,我应该重试吗?
ExcelVBA调用是:
Private Declare Function GetData Lib "getpdata.dll" (ByRef year As Double, ByRef month As Double, ByRef uid As Byte, ByRef pwd As Byte) As String
在您的 excel 的 VBA 中编写一个调用导出的 GetData 函数的中间函数应该可以解决问题。 类似于:
Private Declare Function GetData Lib "getpdata.dll" (ByRef year As Double, ByRef month As Double, ByRef uid As Byte, ByRef pwd As Byte) As String
Function GetDataEx(ByRef year As Double, ByRef month As Double, ByRef uid As Byte, ByRef pwd As Byte) As String
GetDataEx = GetData(year, month, uid, pwd)
End Function
在您的 excel 中,使用中间函数代替原始导出函数。
好的,我一直在使用Excel VBA MsgBox函数来读取从DLL返回的字符串,而我一直在编写DLL。直到现在我才知道 MsgBox 有 1024 个字符的限制,并且会忽略之后的字符。实际上正在返回完整的字符串,但我假设 MsgBox 显示的是它的完整长度(因为我一直在获取超过前 230 个字符的数据时遇到问题)。