String→VARIANT の変換について

解決


ds  2014-01-18 06:59:37  No: 73857

環境: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 18:15:26  No: 73858

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

_variant_t hoge("hoge");

のように使えます。


ds  2014-01-18 22:03:03  No: 73859

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-19 02:07:11  No: 73860

_variant_t 自体が VARIANT なので

pIE->Navigate2(&bs);

でいいのではないかと。

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

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

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


ds  2014-01-19 03:28:08  No: 73861

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

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

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

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


forty-five  2014-01-19 04:22:18  No: 73862

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

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

pIE->Navigate2(&var);

::VariantClear(&var);

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


ds  2014-01-19 05:19:35  No: 73863

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

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

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


forty-five  2014-01-19 17:14:33  No: 73864

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

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

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

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

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

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


ds  2014-01-20 04:35:34  No: 73865

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

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


※返信する前に利用規約をご確認ください。








  このエントリーをはてなブックマークに追加