[C++] CString naar pwsz

Pagina: 1
Acties:

  • Nexopheus
  • Registratie: Juni 2001
  • Laatst online: 28-01 13:50
Goed, wellicht vast wel ergens bekent maar zoek tocht leverd niets op. (is ook al laat, wellicht kijk ik er overheen).

In wil graag van een CString (uit een textveld) een pwsz maken, voor in een COSERVERINFO structuur.
Zodat ik de DCOM server variabel kan zetten.

Dit lukt me echter niet...
De naam hard-coden als
code:
1
serverInfo.pwszName = L"Localhost";

heeft zo z'n beperkingen. :+

Iemand een idee?
BvD

Wat niet kan is nog nooit gebeurd


  • Orphix
  • Registratie: Februari 2000
  • Niet online
En bij expliciet casten naar char* ?
code:
1
serverInfo.pwszName = static_cast<char*>(CString("Localhost"));

* Orphix heeft nooit echt met wchars gewerkt

Verwijderd

WideCharToMultiByte / MultiByteToWideChar ?

  • The End
  • Registratie: Maart 2000
  • Laatst online: 11:56

The End

!Beginning

CString bla = _T("localhost");
serverInfo.pwszName = (LPWSTR)bla.GetBuffer(bla.GetLength());
bla.ReleaseBuffer(-1);

Eigenlijk moet je even de buffer kopieren, maar daaar had ik geen zin in...

  • Nexopheus
  • Registratie: Juni 2001
  • Laatst online: 28-01 13:50
Hoe gebruik ik dan die _T macro vanuit een tekst veld ?
Ik gebruik een member variabele voor een tekst veld en deze heeft als type dus een CString. Wanneer de gebruiker op een knop klikt wil in de servernaam op ipadres gebruiken in die server structuur.

Wat is het nut van de _T macro ?
en hoe pas ik die dynamisch toe ?

Wat niet kan is nog nooit gebeurd


  • Nexopheus
  • Registratie: Juni 2001
  • Laatst online: 28-01 13:50
_T is natuurlijk TCHAR...

Het werkt !
code:
1
2
serverInfo.pwszName =(LPWSTR)m_ServerNameIP.GetBuffer(m_ServerNameIP.GetLength());
    m_ServerNameIP.ReleaseBuffer(-1);

Nu nog even uitzoeken hoe ik de buffer netjes kopieer.
code:
1
2
3
4
LPTSTR lpsz = new TCHAR[m_ServerNameIP.GetLength()+1];
    _tcscpy(lpsz,m_ServerNameIP);

    serverInfo.pwszName =(LPWSTR)lpsz;

Wat is hier verkeerd aan ????

Wat niet kan is nog nooit gebeurd


  • MSalters
  • Registratie: Juni 2001
  • Laatst online: 13-09 23:11
Op vrijdag 21 december 2001 02:24 schreef Nexopheus het volgende:
Goed, wellicht vast wel ergens bekent maar zoek tocht leverd niets op. (is ook al laat, wellicht kijk ik er overheen).

In wil graag van een CString (uit een textveld) een pwsz maken, voor in een COSERVERINFO structuur.
Zodat ik de DCOM server variabel kan zetten.

Dit lukt me echter niet...
De naam hard-coden als
code:
1
serverInfo.pwszName = L"Localhost";

heeft zo z'n beperkingen. :+

Iemand een idee?
BvD
DCOM server betekent waarschijnlijk dat je op NT werkt - daar zijn alle TextBoxes standaard Unicode (=wide). Kun je de wide string niet gewoon in z'n originele vorm krijgen ipv narrowed? Dan hoef je 'm niet eens te converteren.

Overigens ga je het met casts niet redden, ben ik bang. Je kunt wel een char naar wchar_t casten, maar dan krijg je iha niet hetzelfde karakter. Bovendien kun je al helemaal geen char* naar wchat_t* casten; dan is je string niet eens meer terminated : je hebt 16 0-bits nodig om een wchar_t string te terminaten en een char* heeft er maar 8 op het eind.

De meest veilige manier is via std::string / std::wstring; die hebben daarvoor ingebouwde voorzieningen. std::string kun je direct met CString.c_str() initialiseren, en std::wstring.c_str() geeft je een pwsz (wchar_t*). Alleen het stukje string->wstring weet ik effe niet hoe dat moet.
Je zou [url="http://news:comp.lang.c++.moderated"]news:comp.lang.c++.moderated[/url] kunnen proberen - daar zitten de gurus die dat soort dingen weten.
Wel effe duidelijk melden wat je precies wil hebben.

Man hopes. Genius creates. Ralph Waldo Emerson
Never worry about theory as long as the machinery does what it's supposed to do. R. A. Heinlein


  • Nexopheus
  • Registratie: Juni 2001
  • Laatst online: 28-01 13:50
De oplossing die The End heeft aangedragen werkt wel.

Moet alleen nog even de buffer goed kopieeren.

mmm die usenet group zal maar eens goed gaan doorspitten..

Wat niet kan is nog nooit gebeurd


  • The End
  • Registratie: Maart 2000
  • Laatst online: 11:56

The End

!Beginning

Je kan als alles in UNICODE is kopieren met wcscpy.

  • The End
  • Registratie: Maart 2000
  • Laatst online: 11:56

The End

!Beginning

char *gekopieerdestring = new char[bla.GetLenght()];
wcstombs(gekopieerdestring,bla.GetBuffer(bla.GetLenght()),bla.GetLenght());

Op deze manier hoef je hem niet meer te typecasten...

  • The End
  • Registratie: Maart 2000
  • Laatst online: 11:56

The End

!Beginning

Op vrijdag 21 december 2001 11:06 schreef MSalters het volgende:

[..]

[knip]
Overigens ga je het met casts niet redden, ben ik bang. Je kunt wel een char naar wchar_t casten, maar dan krijg je iha niet hetzelfde karakter. Bovendien kun je al helemaal geen char* naar wchat_t* casten; dan is je string niet eens meer terminated : je hebt 16 0-bits nodig om een wchar_t string te terminaten en een char* heeft er maar 8 op het eind.
[/knip]
Dit is niet echt waar... Over het algemeen kan je zonder problemen wchars casten naar chars en andersom. '\0' is voor char en wchar hetzelfde.

  • Nexopheus
  • Registratie: Juni 2001
  • Laatst online: 28-01 13:50
Op vrijdag 21 december 2001 15:46 schreef The End het volgende:
char *gekopieerdestring = new char[bla.GetLenght()];
wcstombs(gekopieerdestring,bla.GetBuffer(bla.GetLenght()),bla.GetLenght());

Op deze manier hoef je hem niet meer te typecasten...
Perfect dit zocht ik!

Wat niet kan is nog nooit gebeurd


  • farlane
  • Registratie: Maart 2000
  • Laatst online: 15-09 22:39
Jullie zagen deze:
WideCharToMultiByte / MultiByteToWideChar ?
over het hoofd !

Somniferous whisperings of scarlet fields. Sleep calling me and in my dreams i wander. My reality is abandoned (I traverse afar). Not a care if I never everwake.

Pagina: 1