PDA

Tam Sürümünü Görmek İçin : convert from 'std::string' to 'ATL::CComBSTR'


jnothing
18/04/2007, 16:48
string s;
CComBSTR html;

şimdi ben bir dosyadan aldığım html kodunu s değişkenine atayıp, sonra html e verip kullanmak istiyorum. Aslında karşılaştığım son sorun başlıktaki ama daha fazla yardımcı olabileceklere yine de teşekkür ederim


acehreli
18/04/2007, 21:55
Ben kullanmadim ama aradigin donusum makrolari su sayfada:

http://msdn2.microsoft.com/en-us/library/87zae4a3(VS.80).aspx

Hizlica anladigima gore, ornegin, A2BSTR makrosu ANSI bir dizgiden BSTR'a donusturuyor, vs. (Makro adlarini bir tabloda anlatmislar.)

Onlara ek olarak sunu da kullanmak gerekebilir: std::string'in c_str() islevi, bir string'in karakterlerini bir C dizgisi olarak verir.

Yani soyle seyler yapman gerekebilir:

CComBSTR html(A2BSTR (s.c_str());

Kolay gelsin; hic bilmeden yazdim... :)

Ali

jnothing
19/04/2007, 22:20
Teşekkür ederim,

şöyle bir çözüm oldu, bir arkadaşımın yardımıyla, buraya yazayım;

string str;
char temp[2000];
char* data;
char* myPath="c:\\js.html";

fstream file_op(myPath,ios::in);


while(!file_op.eof())
{
file_op.getline(temp,2000);
str=str+temp+"\n";
};

data=&str[0];

//cout<<data;

CComBSTR bstrScript(data);

file_op.close();

acehreli
20/04/2007, 00:42
Ben de duzelteyim... :)

&str[0] her ortamda calismayabilir. O kullanim vector icin dogrudur ama string icin garanti degildir. O yuzden string'in c_str() islevini kullanmani onermistim:

data = str.c_str();

Ayni sey; ama dogru... :)

Arkadasininkinin yanlisligi suradan kaynaklaniyor: string'in butun karakterleri art arda bulunmak zorunda degillerdir. Ben bir string gerceklemesi yapar ve string'in degisik parcalarini icerde ayri bolgelerde tutabilirim. O zaman &str[0] yontemi calismaz.

2000? Yeterince uzun mu? ;) O is icin de string kullanabilirsin, ama serbest getline islevini kullanman gerekir:

string temp;
/* ... */
while(getline(file_op, temp))

Ayrica sizin eof() denetiminiz de yanlis olmus; cunku C akimlarinin aksine, C++ aklimlari ancak okumaya yeltenince akim sonuna gelirler. (C'de daha okuma yapmadan bilebiliriz.) Onun icin, sizin yontem herhalde son satiri iki kere ekler. Eger son satir bossa sorun yok tabii... Ama yine de oyle yazmamak gerek... :)

fstream yerine ifstream kullanirsaniz ios::in'i belirtmeye de gerek kalmaz.

Bir dosyanin icerigini bir string'e atmanin bir cok yolu var. Dogrudan akim bellegini (stream buffer) kullandigi icin daha hizli oldugu bilinen iki yontem soyle:

#include <fstream>
#include <sstream>
#include <iostream>

using namespace std;

string birinci_yontem(const char * dosyaIsmi)
{
ifstream giris(dosyaIsmi);
ostringstream cikis;
cikis << giris.rdbuf();

const string sonuc = cikis.str();
return sonuc;
}

string ikinci_yontem(const char * dosyaIsmi)
{
ifstream giris(dosyaIsmi);
const string sonuc((istreambuf_iterator<char>(giris)),
(istreambuf_iterator<char>()));
return sonuc;
}

typedef string (*DenenenIslev)(const char *);

string dene(const char * baslik, DenenenIslev islev)
{
cout << "\n--- " << baslik << " ---\n";
return islev("deneme.txt");
}

int main()
{
cout << dene("birinci", birinci_yontem);
cout << dene("ikinci", ikinci_yontem);
}

Birinci yontemde ifstream'in akim bellegi rdbuf ile aliniyor ve dogrudan cikis akimina gonderiliyor. ostringstream'in str() islevi de icerigi bir string olarak dOndUrur.

Ikinci yontemde ifstream'in akim bellegini kullana bir erisici (iterator) olusturuluyor ve onunla yapilan bir string dOndUruluyor.

Yukarida da soyledigim gibi, &str[0] yapmak yerine, bu islevler soyle kullanilabilir:

const string icerik = birinci_yontem(myPath);
CComBSTR bstrScript(icerik.c_str());

Ali

jnothing
23/04/2007, 18:01
Bu ayrıntılı açıklamaların, yardımın için çok teşekkür ederim. Daha yeni başladım bu olaya ve açıkçası yazdıklarının çoğunu anlamıyorum. Umarım yakında anlayarak yazarım bunları. Tekrar teşekkür ederim.