Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (WinAPI, Konsole) » Typenkonvertierung und BSTR

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 <
000
30.06.2011, 17:02 Uhr
notice7



Hi zusammen,

kurze Frage zu Typenkonvertierung:

Ich spreche ein COM Objekt an, was soweit auch schon Funktioniert.
Die DLL kommt aus VB, einige Funktion, die ich auch schon erfolgreich
aufrufen konnte, erwartet einen BSTR. Bisher habe ich den immer so deklariert:

BSTR val = _bstr_t("helloworld");

com->myfunc(&val);

Das hat eigentlich auch soweit funktioniert - nur jetzt habe ich bemerkt (anhand des erwarteten Rückgabewertes der Funktion ), dass ich den Parameter wie folgt deklarieren muss:

BSTR val = _bstr_t(T"helloworld");

Der Unterschied ist also das T in _bstr_t.
Ich bin nicht sicher was T genau macht, es ist auch wahnsinnig schwer, nach einem Buchstaben zu suchen. Ich vermute dass es irgendwas mit einer Konvertierung in einen widechar zu tun hat - kann mich hier auch völlig irren.

Kann mir jemand einen hinweis geben wo ich hier gute Lektüre finde, bzw. nach was ich noch
suchen könnte?

Außerdem würde ich auch gerne wissen, wie ich einen std::string in solch einen "T-String" konvertieren kann, um ihn dann von _bstr_t letztendlich in ein BSTR umwandeln zu können.

Um es zu verdeutlichen (so geht es natürlich nicht):

_bstr_t(T<HIER_DIE_VARIABLE>;

Danke für jede Hilfe!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
30.06.2011, 19:14 Uhr
0xdeadbeef
Gott
(Operator)


Das kann so eigentlich nicht sein. Meinst du _T()?

Wie dem auch sei, du kannst einen _bstr_t auch eine einfache Zeichenkette geben. Nachlesen kann man das hier, eine Umwandlung passiert dann automatisch.

Es gibt im WinAPI einen Datentyp TCHAR (bzw. LPTSTR, LPCTSTR etc.), um den sich WinAPIs gesamtes String-API aufbaut. TCHAR ist abhängig von den Projekteinstellungen entweder char oder wchar_t, und sämtliche WinAPI-Funktionen lösen je nach Projekteinstellung zu einer Variante auf, die an entsprechenden Stellen entweder char oder wchar_t erwarten. Es gibt da außerdem ein Makro _T(), das um Stringliterale benutzt wird, beispielsweise

C++:
/* LPCTSTR == TCHAR const * */
LPCTSTR foo = _T("bar");


Je nach Projekteinstellung expandiert _T("bar") entweder zu "bar" oder zu L"bar".

Die Schreibweise T"foo" ist mir nicht bekannt. Es wäre prinzipiell möglich, ein Makro zu definieren, das je nach Projekteinstellung zu nichts oder L expandiert, aber ein Bibliotheksentwickler müsste ziemlich durchgeknallt sein, um ein Makro namens T zu definieren - ein Programmierer kann ja durchaus mal auf die Idee kommen, selbst T als Bezeichner zu benutzen.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
01.07.2011, 08:45 Uhr
notice7



Danke für deine Antwort.

Ach verdammt, ich meinte natürlich L"xyz", nicht T - sorry, das hab ich verpennt.
also


C++:
_bstr_t(L"hello world"));


aus deinem Post konnte ich herauslesen dass L wohl einen bestimmten typ "definiert", richtig?
Kannst du mir sagen welcher Typ das ist bzw. wo ich das nachlesen kann und ob es auch eine "Funktion" dafür gibt, mit dem ich Zeichenketten aus Variablen zu L "expandieren" kann?

Dieser Post wurde am 01.07.2011 um 08:47 Uhr von notice7 editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
01.07.2011, 08:50 Uhr
FloSoft
Medialer Over-Flow
(Administrator)


naja, es sollte auch ein


C++:
std::string var = "Hallo World";
BSTR bvar = _bstr_t(var.c_str());



funktionieren - man muss eben nur eben explizit dem std::string einen const char* zurückgeben lassen (mit c_str)
--
class God : public ChuckNorris { };
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
01.07.2011, 09:05 Uhr
notice7



Danke für deine Antwort!
Okay und wozu ist dann das L?
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
01.07.2011, 10:45 Uhr
0xdeadbeef
Gott
(Operator)


Das ist so ähnlich wie die U/L/UL/LL/ULL-Suffixe bei Integern. Ein String-Literal, dem ein L vorsteht, ist ein Wide-String-Literal, d.h. vom Typ wchar_t const[].

Visual Basic benutzt intern wide strings, also dürfte

C++:
_bstr_t foo(L"foo");


etwas schneller sein als

C++:
_bstr_t foo("foo");


...weil keine Konvertierung stattfinden muss, aber funktionieren wird beides.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
01.07.2011, 14:53 Uhr
notice7



ah klasse, so funktionierts:


C++:

_bstr_t foo("bar");

com->put_foo(foo.GetBSTR());




Vielen Dank, dass ihr mir geholfen habt!
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 <     [ C / C++ (WinAPI, Konsole) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: