String→VARIANT の変換について

解決


ds  2014-01-17 21:59:37  No: 73857  IP: [192.*.*.*]

環境:VC++2008、WINDOWS-Vista,2007
VC++にてInternetExplorer(IE)を操作しようとしてOLE(COM?)インターフェイスを使おうとIWebBrowser2Ptrを使用としたのですが、その中のNavigate2でURLアドレスを『*VARIANT』型にて指定。とありました。StringからVARIANTへの変換方法をどなたか教えてください。環境の関係で『COleVariant』は使えません。(afxdisp.h:MFCクラスが使えません。)
よろしくお願いいたします。

編集 削除
forty-five  2014-01-18 09:15:26  No: 73858  IP: [192.*.*.*]

IWebBrowser2Ptr (_com_ptr_t) が使えるなら _variant_t も使えるはずです。
もし定義がないなら <comdef.h> をインクルードすればいいです。

_variant_t hoge("hoge");

のように使えます。

編集 削除
ds  2014-01-18 13:03:03  No: 73859  IP: [192.*.*.*]

forty-fiveさん  ありがとうございます。

次のようにしたのですが、コンパイルはOKなのに実行時に
フリーズしてしまいます。どこかおかしいのでしょうか?

SHDocVw::IWebBrowser2Ptr pIE;
pIE.CreateInstance(L"InternetExplorer.Application");
pIE->PutVisible(VARIANT_TRUE);
ここまでは問題なく実行されます。以下を付けるとフリーズします。

_variant_t bs("http://www.***/");
pIE->Navigate2(bs.pvarVal);

ポインターの考えがおかしいとはおもうのですが・・・

編集 削除
forty-five  2014-01-18 17:07:11  No: 73860  IP: [192.*.*.*]

_variant_t 自体が VARIANT なので

pIE->Navigate2(&bs);

でいいのではないかと。

_variant_t のメンバ変数は普通は使わないです。
指定の型が欲しい場合はキャストに任せた方がいいです。

long n = _variant_t(L"123"); // UNICODE 文字列を long に変換

確か変換に失敗した場合は _com_error がスローされるので
ハンドルするようにした方がいいと思います。

編集 削除
ds  2014-01-18 18:28:08  No: 73861  IP: [192.*.*.*]

forty-fiveさん  今回も早急な返事ありがとうございます。

最初の質問のあと、数十種類のパターンをテストしました。その中に
pIE->Navigate2(&bs);やキャストキャスト
も入っていますが結果は同じでした。またフリーズの結果ですがデバッグで確認したら
『(このプログラム名).exe の 0x76e712b2 で初回の例外が発生しました: 0xC0000005: 場所 0x524c0fb4 を読み込み中にアクセス違反が発生しました。』とのコメントがありました。

また、ほかのラインをすべてコメントアウトして
_variant_t bs("http://www.***/");
だけデバッグしても結果は同じでした。
ただ、VariantChangeType()を使うとこのラインは問題なくなりましたが、
pIE->Navigate2(&bs);で同じもんだいが起こりました。

そもそも、VC++本体の設定がおかしいのでしょうか?

編集 削除
forty-five  2014-01-18 19:22:18  No: 73862  IP: [192.*.*.*]

数十回テストしたのにステップ実行はしなかったんですか?

VARIANT var;
::VariantInit(&var);
V_VT(&var) = VT_BSTR;
V_BSTR(&var) = ::SysAllocString(L"http://...");

pIE->Navigate2(&var);

::VariantClear(&var);

これをステップ実行するとどうなりますか?

編集 削除
ds  2014-01-18 20:19:35  No: 73863  IP: [192.*.*.*]

forty-fiveさん  毎回ありがとうございます。
結果は全く同じです。
(『・・・アクセス違反が発生しました。』です。

ほかのWebでの同じことをしているソフトをコピペしても
全く同じ結果になります。

ところでステップ実行とは、何でしょう?LINK時点でダメなものをステップ毎のチェックはできないような・・・・
いい方法があればおしえてください。

編集 削除
forty-five  2014-01-19 08:14:33  No: 73864  IP: [192.*.*.*]

ステップ実行の意味も分からないんですか?
びっくりしたのでググってみたら

その1 デバッグの超基本「ステップ実行」
http://marupeke296.com/DBG_No1_Step.html

ここが最初にヒットしました。
これが分からないんじゃ正直どうしようもないかと・・・

LINK時点で、とかVC++本体の設定、とか言ってるってことは
もしかしてプログラムのビルド自体に失敗してるってことですか?
でもそれだと
> (このプログラム名).exe の 0x76e712b2 で初回の例外が発生しました
と矛盾するしなあ。

> ほかのWebでの同じことをしているソフトをコピペしても
これもちょっと意味が分かりません。
エスパー解釈すれば
「ネットで公開されているオープンソースのソフトウェアのソースをコピペして試してみた」
ってことなのかな。

ちょっと私には訳が分からないですね。
はたから見てたらどうなんでしょうか。
私では無理そうなのでどなたか代わりに助けてあげてください><

編集 削除
ds  2014-01-19 19:35:34  No: 73865  IP: [192.*.*.*]

forty-five さん、無事解決しました。
”COM"ということを、すっかり忘れていました。COMの手順をちゃんとしたら
OKでした。いろいろありがとうございました。

ちなみに、forty-five さんが言う「ステップ実行」は「ステップイン・アウト・・・」とかいうやつですか?それはLinkが完成(実行可能)になってからできるものではないでしょうか?我々初心者にはよくわかりませんが・・・

編集 削除