Konwersja VARIANT na String

0

Jak przekonwertować VARIANT https://msdn.microsoft.com/en-us/library/windows/desktop/dd373687%28v=vs.85%29.aspx na String lub tablicę String?

0

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);
}

user image

0
#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ć?

1

Może tak?

{
	VARIANT v;
	string vr;
	VariantInit(&v);
	vr = (char*)(_bstr_t)v;
	VariantClear(&v);

	printf("%s", vr.c_str());
} 
0

Dalej ten sam błąd

user image

0

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.

0

"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.

0

@Azarien skopiowałem tę libkę od Visual Studio 2015 zadeklarowałem w Dev-C++ i dalej to samo :(

0

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
user image
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);
}

1 użytkowników online, w tym zalogowanych: 0, gości: 1