Konwersja VARIANT na String

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

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

carlosmay
  • Rejestracja:około 9 lat
  • Ostatnio:ponad 5 lat
  • Lokalizacja:Pabianice
1

Może tak?

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

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

edytowany 1x, ostatnio: carlosmay
0

Dalej ten sam błąd

user image

carlosmay
  • Rejestracja:około 9 lat
  • Ostatnio:ponad 5 lat
  • Lokalizacja:Pabianice
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.


edytowany 1x, ostatnio: carlosmay
Azarien
  • Rejestracja:ponad 21 lat
  • Ostatnio:około 6 godzin
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.

carlosmay
Słyszałem, że dev daje różne dziwne komunikaty. Może i ten nie mówi, że nie ma pliku, tylko że nie może dolinkować. W C::B na gcc 5.x daje w logu, że no such file directory.
Azarien
jeśli nie może znaleźć nagłówka to znaczy że to jest biblioteka specyficzna dla Visuala, i trzeba sobie poradzić bez niej.
0

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

Azarien
obawiam się, że nie poleci. musisz sobie poradzić bez.
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

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

Zarejestruj się i dołącz do największej społeczności programistów w Polsce.

Otrzymaj wsparcie, dziel się wiedzą i rozwijaj swoje umiejętności z najlepszymi.