// 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);
}

A 回答 (1件)

ソースコードを見る限り、問題ないと思いましたが、何か問題がありますのでしょうか?


その問題を書いてもらわないと、困っていることが解りません。
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aと関連する良く見られている質問

Q中2男子です。 博多で、女子とエ○いことをする予定があります。未成年のためホテルNG。無料がいいし、

中2男子です。
博多で、女子とエ○いことをする予定があります。未成年のためホテルNG。無料がいいし、いい場所ありますか?

Aベストアンサー

青かん

Qstd::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だったら、簡単に代入処理として出来るのですが、継承した場合はどの様に実装すればいいのでしょうか?
宜しくお願いします。

#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をクラスに代入する処理として、
multiS...続きを読む

Aベストアンサー

正確なエラーメッセージは
「すべてのコントロールのパス, 関数を回帰するとランタイムスタックオーバーフローが発生します」
というもの.
ここの this は multiString * です. そして operator = は継承されないので, コンストラクタ中の *this = s; における operator = は wstring::operator = ではなく multiString::operator = です. しかも今の場合このメンバー関数を定義していないので, コンパイラが自動生成した
multiString &multiString::operator =(const multiString &)
を使います. ところが, 代入の右辺は const wchar_t * ですからこの代入演算子にあわせるためにコンストラクタ
multiString::multiString(const wchar_t *)
を呼び出そうとします. これで無限再帰が成立.
明示的に std::wstring::operator = を呼び出せばいいんだけどね....

正確なエラーメッセージは
「すべてのコントロールのパス, 関数を回帰するとランタイムスタックオーバーフローが発生します」
というもの.
ここの this は multiString * です. そして operator = は継承されないので, コンストラクタ中の *this = s; における operator = は wstring::operator = ではなく multiString::operator = です. しかも今の場合このメンバー関数を定義していないので, コンパイラが自動生成した
multiString &multiString::operator =(const multiString &)
を使います. ところが, ...続きを読む

Q無料のドラマ・映画動画配信は危険ですか?

最近、有料のドラマ・映画i-modeの動画配信を楽しみにしていますが料金が高くて見るのをためらいます。
昨夜無料のドラマ等の動画配信中!見放題!を多数見つけました。

無料の動画配信にむやみにクリックすると危険ですか?

i-modeで無料動画配信で安心なサイトがありましたら教えて下さい

Aベストアンサー

見放題ってのに騙されちゃいかん。
携帯はどうかわからないけど
PCで 見放題 というのは
月○万円で・・・とかの場合がほとんどだよ^^;
しかも利用規約を済みから済みまで読んで
やっと見つけられるって感じ。
(アダルト系に多い)

質問者様がどのような無料動画を見ようと
してるのか・・・・がわからないけど^^;

まぁやるなら
危険覚悟で。

Qstd::wstringのメモリリークについて教えてださい

C++でプログラムを書いていたところメモリリークしているのを発見しました。

そこでなんとかメモリリークしている箇所を特定してみたのですが、なんとstd::wstringとstd::stringがメモリリークしているようです。
(UNICODEとマルチバイト文字に対応させるため両方でプログラムかいています)

ローカル変数で関数さえ抜ければメモリからは消滅するはずのstd::wstringやstd::stringがメモリリークしているのは何か原因でもあるのでしょうか?

よろしくおねがいします。

Aベストアンサー

 こんばんは。

>>ローカル変数で関数さえ抜ければメモリからは消滅するはずのstd::wstringやstd::stringがメモリリークしているのは何か原因でもあるのでしょうか?
 原因は幾つか考えられます。そもそもstd::wstring等は、ローカル変数で有ろうと無かろうと、コンテナ内部で動的にメモリのアロケーションを行っているのです。
 なので、デストラクタが立ち上がる迄はコンテナ内部のメモリは開放されません。
 main()の一番下に_CrtDumpMemoryLeaks()を置いても検出の方が先に実行されます。よってリークしていると判断されてしまいます。

void main(void)
{
Data dat;
dat.age = 35;
dat.name = L"てすと";
hoge( dat );
int leaks = _CrtDumpMemoryLeaks();
//--------------------------------
dat::~Data();の呼び出される。ここでstd::stringの内部が開放される
}

 例えDataのデストラクタに_CrtDumpMemoryLeaks()を置いても、その後にstd::stringのデストラクタが立ち上がるので、検出が早すぎる事になります。
 以下の物で試して見れば分かる筈です。
 
class inner
{
public:inner() : p(new int(1)){}
~inner()
{
delete p;
cout << "innter destructor : " << _CrtDumpMemoryLeaks() << endl;//ココが適切な位置
}
private:int* p;
};

class outer
{
public:~outer()
{cout << "outer destructor : " << _CrtDumpMemoryLeaks() << endl;}//早すぎる
private:inner in;
};

int main(void)
{
cout << "in main function " << _CrtDumpMemoryLeaks() << endl;//早すぎる
return 0;
}

 まあ、この程度なら良いのですが、もっと沢山のクラスが有る場合、追跡するのは非常に大変です。ただ、せめても、デストラクタだけは書いておいた方が、やり易くはなるとは思います・・・。
 で、質問者様のコードは、以下の様にすればリークしていないのが分かります。 

void test()
{
Data dat;
dat.age = 35;
dat.name = L"てすと";
hoge( dat );
}

int main(void)
{
test();
cout << "in main function " << _CrtDumpMemoryLeaks() << endl;
return 0;
}

 此れでリークしていた場合

(1)別の何処かでリークしている
(2)STLのアロケータの問題

 と言う事に成りそうです。(1)は良いとして、(2)の方はSTLPort等を使用している場合、デフォルトアロケータ(SGIアロケータ)を使用していると、容赦なくリークします。

 http://www.google.co.jp/search?hl=ja&q=STLPort+SGI+leak&lr=

 その場合、コンフィグのマクロで、new又はmallocで割り当てるアロケータを使用させます。

 こんばんは。

>>ローカル変数で関数さえ抜ければメモリからは消滅するはずのstd::wstringやstd::stringがメモリリークしているのは何か原因でもあるのでしょうか?
 原因は幾つか考えられます。そもそもstd::wstring等は、ローカル変数で有ろうと無かろうと、コンテナ内部で動的にメモリのアロケーションを行っているのです。
 なので、デストラクタが立ち上がる迄はコンテナ内部のメモリは開放されません。
 main()の一番下に_CrtDumpMemoryLeaks()を置いても検出の方が先に実行されます。よってリー...続きを読む

QPCで無料でエロ動画とるのって違法なんですか?

無料でエロ動画ダウンロードするのって違法なんですか?罰則はあるんですか?
あとパソコンで無料のエロ動画をダウンロードした事ないんですが、携帯で無料のエロ動画をダウンロードするのと同じようなやり方なんですか?

Aベストアンサー

追記
知り合いの経験者の方から過去に注意を受けていたので、
書き込みしています。

その方のお話ですが…ト或る会員制サイトに登録して、
観覧していたそうで(幾つかDL)落とした物の中に違法な
映像が含まれていたそうです。

で、或る監督さんが捕まり起訴されてその方の撮られた
映像が幼児関連だったそうです。

芋づる式に会員が挙げられ…知り合いの方の所にも警察が?
PC に保存していた映像にそれが…その方は、全く気ずいて
なかったそうですが…編集ミスで、映像の最後に含まれて居
た…映ってますね?と言われて逮捕されたそうです。
幼児を縛って、排泄させてる映像が…かれは、実刑で服役さ
れて…現在は、出所していますが…

Qstd::cout << p と std::cout << *p の違

std::cout << p と std::cout << *p の違いは?

VC++でコードを書きながらC++を学んでいます。
ポインタで疑問に思ったことがあるので質問させて下さい。

int* p;
int n = 100;
p = &a;

上記のように変数を宣言・代入した場合、
std::cout << p と std::cout << *p のどちらでも"100"と表示されます。
これら二つの違いは何でしょうか?
本来*pとすべきところをpにしてもVC++が気を利かせて
&pのアドレスに入っているデータを表示してくれているということでしょうか?

Aベストアンサー

No.1氏の回答にあるコードを元に答えます。

>この場合&pでもアドレスが表示されると思うのですが、
>「&p」と「p」の違いは何でしょうか?
pはaのアドレス。
&pはpのアドレス。
(「p = &a」では、どこのアドレスを渡しているのか考えてみて下さい)


「&p」と「p」の違いというのが参照とポインタの違いを聞いているのだとしたら、constのポインタ==参照型で良かったと思います。
p = &a; //OK
&a = p; //error
int* const p2 = p;
p2 = &a; //error

Q無料動画ソフトで、初心者でも簡単でき無料編集ソフトを教えてください

無料動画ソフトで、初心者でも簡単でき無料編集ソフトを教えてください

パソコン初心者です。
ライブチャット用のカメラで録画したのですが、知り合いに動画を送りたいと思ってます
10人くらい

ネットに無断転載とかされると不安なので、ロゴなどをいれたいのですが
映像の最初から最後まで、文字を入れたいのですが
無料動画ソフトで初心者でも簡単にできる動画編集ソフトがあれば教えてください

動画に関しては、全くの初心者です
よろしくおねがい致します

Aベストアンサー

無料で手軽さなら最初から入っているWindowsムービーメーカーが良いかも知れません
導入したりする手間も不要ですし

http://d.hatena.ne.jp/dangerous1192/20070722/p1

WindowsムービーメーカーとはMicrosoftが作った初心者向けの動画編集ソフトですから

Qint main()、void main()、void main(void)、int main(void)

今日、大学でC言語の講義の時間、先生が、

#include <stdio.h>

void main(void){

}

と宣言してプログラムを書くと教えていました。
main関数には、
main()
void main()
void main( void )
int main()
int main( void )

と、人によりいくつかの描き方があったりします。
どれが本当は正しいのでしょうか?
void mainはすべきではないとなんかの本で読んだのですが・・。

Aベストアンサー

通称C89という以前の言語規格(現行コンパイラの多くが準拠)では、下記のいずれかが正しい。
int main(int argc, char *argv[])
int main(void)

但し、最新のC言語規格(通称C99)では、
<ISO/IEC9899:1999>
or in some other implementation-defined manner.
</ISO/IEC9899:1999>
となっているので、処理系が戻り値のvoidを認めていればvoidも可。
# 組込み系などで戻り値を使わない環境もあるためでしょうか。

なので、コンパイラのマニュアルで戻り値のvoidにしていい/しろと書いてない限り、
voidは言語仕様的には正しくない。(でも動くものもある)

Q無料で見れるアダルト動画無料で見れるアダルト動画

無料で見れるアダルト動画
無料で見れるアダルト動画

Aベストアンサー

XVIDEO

Qvoid (*signal(int signum, void (*handler)(int)))(int);

の解釈を教えてください
最後の「(int)」については詳しくお願いします

Aベストアンサー

signalが

(1)1つ目の引数の型:int
(2)2つ目の引数の型:引数がintで戻り値がvoidである関数へのポインタ
(3)戻り値の型:引数がintで戻り値がvoidである関数へのポインタ(2と同じ)

を満たす関数である事を宣言しています。最後の(int)はsignalの戻り値の
関数ポインタがint型の引数を持つ事を示しています。

「引数がintで戻り値がvoidである関数へのポインタ」の型をHANDLERと表すと

HANDLER signal(int signum, HANDLER handler);

となります。


人気Q&Aランキング

おすすめ情報