• 締切済み

STLのwstring型から BSTR型 への変換

// STLのwstring型から BSTR型 への変換てこんな感じでいいのでしょうか? #pragma warning(push,3) #include <string> #pragma warning(pop) #include <Windows.h> void main(void) {  std::wstring sString1 = L"This is STL_wstring";  std::wstring sString2;  BSTR sWork1 = ::SysAllocString(L"This is BSTR\n");  BSTR sWork2;  sString2 = sWork1;  sWork2 = ::SysAllocString(sString1.c_str()); // ここ  ::SysFreeString(sWork1);  ::SysFreeString(sWork2); }

みんなの回答

  • mi65536
  • ベストアンサー率100% (6/6)
回答No.1

ソースコードを見る限り、問題ないと思いましたが、何か問題がありますのでしょうか? その問題を書いてもらわないと、困っていることが解りません。

関連するQ&A

  • STL string::findで見つからなかった時

    STL string::findで見つからなかった時の 書式を教えて下さい。 <-----ソース start-------> #define UNCODE #define _UNCODE #pragma warning( push,3 ) #pragma warning( disable : 4786 ) // 識別子が '255' 文字に切り捨 #include <iostream> #include <string> #include <vector> #pragma warning( pop ) #pragma warning( disable : 4514 ) // 参照されていないインライン関数は削除 #pragma warning( disable : 4786 ) // 識別子が '255' 文字に切り捨 int wmain(int iArgC, wchar_t* ArgV[], wchar_t* EnvP[]) {  setlocale( LC_ALL, "Japanese" );  std::vector<std::wstring> m_sEnv;  std::vector<std::wstring> m_sArg;  unsigned long lLoop;  unsigned long lPos;  for (lLoop=0; lLoop<(unsigned long)iArgC; lLoop++) {   m_sArg.push_back(ArgV[lLoop]);  }  for (lLoop=0;;lLoop++) {   if (EnvP[lLoop] == NULL) break;   m_sEnv.push_back(EnvP[lLoop]);  }  for (lLoop=0;lLoop<m_sEnv.size();lLoop++) {   if ((lPos = m_sEnv.at(lLoop).find(L"jdk1")) != npos) { // *1    std::wcout << m_sEnv.at(lLoop) << std::endl;   }  }  return 0; } <-----ソース end-------> *1 で error C2065: 'npos' : 定義されていない識別子です。 「std::npos」も試したけどだめだった。 >>以下MSDNより >>basic_string::npos >>static const size_type npos = -1; >>この定数は、size_type 型として表現できる最大の値です。 >>max_size() よりも大きいことが保証されるため、 >>非常に大きな値または特殊なコードとして使用できます。

  • wstringについて

    以下のプログラムを実行すると「Abnormal program termination」となってしまいます。 何故なのでしょうか? どこか間違っているところがあるのでしょうか? #include <iostream> #include <string> int main(void) { std::wstring ws = L"文字列"; std::wcout.imbue(std::locale("japanese")); std::wcout << ws << std::endl; return 0; } 環境はWindowsXP/Borland C++ Compiler 5.5です。 よろしくお願いします。

  • STLのstringのサイズが0なのに、printfできちゃうのはなぜ

    STLのstringのサイズが0なのに、printfできちゃうのはなぜ? たとえば、以下のような小文字変換処理を考えます。 std::string str = "ABC"; std::string strTmp = ""; std::transform( str.begin(), str.end(), strTmp.begin(), ptr_fun(::tolower) ); この時、strTmpには"abc"が入っていると思っていたのですが、 strTmp.compare("abc") が0になりませんでした。strTmp.size()が0になっており、どうも空文字""と認識されているようです。 ですが、 printf( strTmp.c_str() ); とすると、"abc"と出力されます。printfで上記のようにデバッグしていたので、なかなかミスが発見できなかったのですが、strTmpの初期化で""を入れているために、compareがうまく動かなかったようです。 std::string strTmp = ""; のところを std::string strTmp = str ; と直すと、compareが期待通りに動きました。 長くなってすみませんが、ここからが質問です。 1.stringの初期化時に確保した文字列長は、その後変更できないのでしょうか?今まで、普通に""で初期化した後、別の文字列を代入したりしていたような気がするのですが…。 2.strTmpのサイズが0にもかかわらず、printfで(一見)期待通りの結果が出力されたのは、なぜでしょうか?printfは、ヌル文字までを出力する仕様みたいですが、そもそもstringのsize()も、ヌル文字までの長さを返すのではなかったでしょうか。 全ソースは、以下の通りです。 #include <string> #include <algorithm> #include <functional> #include <ctype.h> #include <stdio.h> int main() {  std::string str = "ABC";  std::string strTmp = ""; // strにすると動く  std::transform( str.begin(), str.end(), strTmp.begin(), std::ptr_fun(::tolower) );  printf( "compare = %d\n", strTmp.compare("abc") );  printf( "size = %d\n", (int)strTmp.size() );  printf( "strTmp = %s\n", strTmp.c_str() );  return 0; }

  • テンプレート関数に関して質問です。

    テンプレート関数に関して質問です。 wstringとstringに対して、似たような処理を行いたいので、template関数を使ってうまく定義できないかと思ったのですが、例えば、 #include<string> template<class T> void hoge(T &s){ s="a"; } void main(void){ std::string str; hoge(str); } の場合、class TがwstringだとL"a"としないといけないのですが、Tによってこれを変えることは可能でしょうか? また、できれば、hogeに想定外の変数を入れられたくないので、hogeをtypedefのようなのりで、 void foo(std::string &s); void foo(std::wstring &s); と定義しておきたいのですが何か良いアイデアはないでしょうか? 当然、hogeはstaticグローバル変数のように外部からはアクセスできないようにしておきたいのです。 よろしくお願いします。

  • C++/STLの動作

    お世話になっております。 クラスのインスタンス化時に自身のポインタをストックしようと下記を実行しましたが、 出力が0となり、予想に反していました。 そこで、"test.cpp"の3行目を"main.cpp"に移動すると正しく動作します。 これはどういった動作が原因で起こったのでしょうか? よろしくお願いします。 /// test.h /// #include <vector> class Test { public: Test(){list.push_back(this);} static std::vector<Test*> list; }; /// test.cpp /// #include "test.h" std::vector<Test*> Test::list; /// main.cpp /// #include <stdio.h> #include "test.h" Test test; void main() { printf( "%d\n", test.list.size() ); // "1"と出力されると思ったけど… }

  • C++でSTLを使った文字列操作

    C++素人です。 第一引数で指定するファイルパスの 拡張子を.datに変更する関数を作っていますがうまくいきません。 STLの使い方が悪いのでしょうか? #include <string.h> using namespace std; char *exchange(const char *fname) { char *file; char *ex; string str; str = fname; ex = ".dat"; str.erase(str.find_last_of('.')+1); file = strcat(str, ex); return file; } int main(int argc, char *argv[]) { char *file = exchange(argv[1]); return 0; }

  • std::wstringの継承

    #include<iostream> #include<string> #include <stdlib.h> #include <locale.h> #include <boost/lexical_cast.hpp> using boost::lexical_cast; using namespace std; VisualC++2008ExpressEditionで文字や数字を簡単に扱えるクラスを今作ろうとしていて以下のように作ってみました。 class multiString:public std::wstring{ public:   multiString(const wchar_t *ws){     /* multiString class自体に代入 */   } }; しかし、このwchar_tをクラスに代入する処理として、 multiString(const wchar_t *s)std::wstring(s); とすると、「error C2082: 仮パラメータ 's' が再定義されました。」となりますし、 multiString(const wchar_t *s)*this=s; とすると、例外が発生してしまします。 wstringだったら、簡単に代入処理として出来るのですが、継承した場合はどの様に実装すればいいのでしょうか? 宜しくお願いします。

  • C++

    C++で書いた下記のプログラムが、文字の入力が1023個までなら実行されますが、1024個を超えると実行されません。なぜだか分かる方、教えてください。 #include <iostream> #include <string> using namespace std; int main(void) { string Str; cin >> Str; cout << "here"; }

  • shared_ptr クラスについて

    shared_ptrクラスを使いたいのですが、使えません、どうしてでしょうか?ソースはこれです。 #include<iostream> #include <string> #include <fstream> #include<memory> using namespace std; class SMonster{ string name; int power; public: SMonster(); SMonster(int p); ~SMonster(){ }; void SetPower(int p); int GetPower(SMonster& t)const; void walk(const string& str); int GetPoint(void)const; }; class B {}; class D : public B {}; int main(void) { shared_ptr<D> sp0(new D); SMonster m(200); SMonster n(100); std::cout<<m.GetPower(m)<<std::endl; std::cout<<n.GetPower(n)<<std::endl; ShowWindow(10); }

  • VectorなどSTL?テンプレートの使い方

    戻り値がポインタの場合、関数から抜け出すと値の保証が無いので、それを使用する場合は、変数にコピーして使うと値は残る(アクセス可能)と理解しています。 char tmp[128]; strcpy(tmp, test()); それで、次のような vector??を使った場合、表示の場合は問題ないかもしれませんが、その後、値を使い続ける場合、ポインタのままでよいのか疑問に思っています。 以下のソースは勝手気ままに記述したものですが、 VC++6でエラーなく動作(とりあえず動く)しているのですが、今後発生する問題など知りたいです。 #include "stdafx.h" #include <string> #include <iostream> #include <vector> #include <sstream> using namespace std; class A { string str; vector<A *> v_cls; public: A(){ } // デフォルトコンストラクタが必要? A(string s){ str = s; } void PrintData(void){ // 表示 cout << str << endl; } // 1から9までの[0]-[9]の文字列を作成 vector<A *> ArraySet(void){ stringstream ss; for (int i=0; i < 10; i++){ ss.str(""); ss << "function [" << i << "]\n"; v_cls.push_back( new A( ss.str() ) ); } return v_cls; } }; void main(void){ // 1から9までの[0]-[9]の文字列を作成 // これは問題ないと思う vector<A *> v; stringstream ss; for (int i=0; i < 10; i++){ ss.str(""); ss << "[" << i << "]\n"; v.push_back( new A( ss.str() ) ); } v[1]->PrintData(); v[3]->PrintData(); ////cout << v.size(); // クラス自身にvector配列?を返す処理 // とりあえず動いているだけ??? A x; vector<A *> ret = x.ArraySet(); // このような代入でも問題ないのでしょうか? ret[5]->PrintData(); // 表示だけなので、問題なし? ret[0]->PrintData(); // vやret, xの解放仕方とタイミングはどうすればよいのでしょうか? }