Jak przekonwertować VARIANT https://msdn.microsoft.com/en-us/library/windows/desktop/dd373687%28v=vs.85%29.aspx na String lub tablicę String?
Poglądowy kod
#include <windows.h>
#include <stdio.h>
#include <string>
using namespace std;
int main()
{
VARIANT v;
VariantInit(&v);
VariantClear(&v);
printf("%s", (string)v);
}
#include <windows.h>
#include <stdio.h>
#include <string>
#include <comutil.h>
#include <comdef.h>
using namespace std;
int main()
{
VARIANT v;
string vr;
VariantInit(&v);
VariantClear(&v);
printf("%s", ((LPCSTR)((_bstr_t)v)));
}
Mam błąd:
undefined reference to `_com_util::ConvertBSTRToString(wchar_t*)@4'
Co dodać?
Może tak?
{
VARIANT v;
string vr;
VariantInit(&v);
vr = (char*)(_bstr_t)v;
VariantClear(&v);
printf("%s", vr.c_str());
}
Dalej ten sam błąd
Nie widzi narzędzi i tyle. TDM GCC może nie mieć zaimplementowanych plików comutil.h
i comdef.h
.
Poszukaj w necie jak je podlinkować do kompilatora.
"undefined reference" to błąd linkera, a więc plik nagłówkowy JEST, tylko brakuje libki.
Pod Visualem biblioteka nazywa się comsuppwd.lib
(debug) i comsuppw.lib
(release).
Nie wiem jak w GCC.
@Azarien skopiowałem tę libkę od Visual Studio 2015 zadeklarowałem w Dev-C++ i dalej to samo :(
Chyba stał się cud grzebiąc w plikach comutil.h że w przestrzeni nazw _com_util używany jest ConvertBSTRToString i przy nim występuje ten problem
Gdy nie podawałem mu żadnych parametrów problemu nie było szukałem w google jak naprawić ten błąd i nagle trafiłem na tą stronę :) http://www.codeproject.com/Articles/1969/BUG-in-com-util-ConvertStringToBSTR-and-com-util
po wstawieniu tej funkcji kod się skompilował bez problemu i wreszcie mój problem został rozwiązany
#include <windows.h>
#include <stdio.h>
#include <comutil.h>
#include <comdef.h>
#include <string>
using namespace std;
inline char* ConvertBSTRToString(BSTR pSrc) {
if(!pSrc) return NULL;
//convert even embeded NULL
DWORD cb,cwch = ::SysStringLen(pSrc);
char *szOut = NULL;
if(cb = ::WideCharToMultiByte(CP_ACP, 0,
pSrc, cwch + 1, NULL, 0, 0, 0)) {
szOut = new char[cb];
if(szOut) {
szOut[cb - 1] = '\0';
if(!::WideCharToMultiByte(CP_ACP, 0,
pSrc, cwch + 1, szOut, cb, 0, 0)) {
delete []szOut; //clean up if failed;
szOut = NULL;
}
}
}
return szOut;
};
int main(){
VARIANT v;
string vr;
VariantInit(&v);
VariantClear(&v);
ConvertBSTRToString((_bstr_t)v);
}