C++BuilderXE2でVariant型を調べる方法

このQ&Aのポイント
  • C++BuilderXE2でVarinat型を見る方法について教えてください。
  • Variant型は16バイトで構成されており、タイプに応じた解釈が必要です。
  • Memo1->Lines->Add("ISCHAR " + TargetFrameName->ISCHAR);という使い方はできません。
回答を見る
  • ベストアンサー

Variant型の中を調べる。

C++BuilderXE2 です。(この投稿は他でも行っていることをご了解ください) CppWebBrowserでページ移動が生じる場合に発生するイベント void __fastcall TForm1::onbefore_navigate2(TObject *Sender, LPDISPATCH pDisp, Variant *URL, Variant *Flags, Variant *TargetFrameName, Variant *PostData, Variant *Headers, VARIANT_BOOL *Cancel) において渡される、Variant型を見る方法について教えて下さい。 Varinat型ははじめて見ますが、検索すると16バイトで構成されるているようです。 タイプを見て、それにあった解釈をするようにせざるを得ないのでしょうか。 msdnの http://msdn.microsoft.com/en-us/library/dd301308.aspx の記事を参考に明らかに文字のはずであるTargetFrameNameについて、試しに Memo1->Lines->Add("ISCHAR "+ TargetFrameName->ISCHAR); としたところ、 [BCC32 エラー] login.cpp(119): E2316 'ISCHAR' は 'Variant' のメンバではない となります。このような使い方はできないのでしょうか。 なお Memo1->Lines->Add("url:"+*URL); とするとそれらしいURLが表示されます。

質問者が選んだベストアンサー

  • ベストアンサー
  • nda23
  • ベストアンサー率54% (777/1415)
回答No.2

その辺の情報はヘッダファイルにあります。 プリミティブなデータ型は0~72です。 この他、0x2000は配列、0x4000は参照です。 >16396 これから見ると参照+12なので、型としては VARIANTのポインタになります。 つまり、元データの+8からの4バイトは対象 となるVARIANT型データへのポインタという ことになります。 以下を見てください。 http://msdn.microsoft.com/en-us/library/windows/desktop/aa380072(v=vs.85).aspx

qhtsige
質問者

お礼

詳細な情報ありがとうございます。 何度も苦吟して、ご指摘通りのDWORDはさらにVariant型への参照すなわちポインタになる(らしい)ことがわかりました。そうすると実体はさらにその先のVariant型のタイプを調べることになるのですね。 落ち着いて、調べることにします。予想ではascii文字になるはずな訳ですが。 また疑問がでてくれば教えて下さい。

その他の回答 (1)

  • nda23
  • ベストアンサー率54% (777/1415)
回答No.1

VARIANT型は先頭の16ビット整数の vtと言うメンバが型を示します。 文字列はVT_BSTR(=8)です。 文字列へのポインタはbstrValで 先頭から8バイト目にあります。

qhtsige
質問者

お礼

ご返事ありがとうございます。 やはり、中を見るためには自分で、タイプを判別しなければならないのですね。Variantのデータへのポインタ等は8バイト目にあることもmsdnでわかりました。 実際に見たいのは、PostDataでそのタイプを PostData->vt_PostData で見ると、16396 でした。このPostDataは実際にはIDとpasswordになると思うのですが、この中身を調べることはできるのでしょうか。8バイト目からの4バイトで示す領域が、実際のPostDataが格納されている場所にあたると思いますが、文字型などのようにそのサイズを知ることがわかりません。実際にサーバに送信されるわけですから、その長さの情報はどこかにあるはずなのですが。 このような当りの情報はないでしょうか。

関連するQ&A

  • object.Navigateのパラメータ

    object.Navigateのパラメータについて教えてください。 VB6.0(SP5)、Win98SEで開発しています。 object.Navigate URL [Flags,] [TargetFrameName,] [PostData,] [Headers] 上記の命令でPostデータを送りたいのですが FlagsとTargetFrameNameというのが分かりません。 分かる方教えてください。

  • BCB CPPWEBBROWSERでPOSTデータを送信する方法

    BCB5で、TCppWebBrowser、RichEdit、Buttuonを貼り付けたフォームがあります。このRichEditの内容を、POSTメソッドでWebサーバ上のCGIへ渡して、結果をCppWebBrowserで表示したいのですが、以下のようなコードで試したところ、POSTデータが反映されません。 PostDataのVariant型の扱いなどがおかしいのでしょうか。ご存知の方、ご教授ください。 void __fastcall TLogoAppForm::Button1Click(TObject *Sender) { AnsiString strPost; AnsiString strURL; strURL = "http://192.168.0.1/searchdb/index.cgi"; strPost = RichEdit1->Lines->Text; TVariant *PostData = new TVariant; PostData->bstrVal = "mydata=hogehoge"; Web->Navigate(WideString(strURL),NULL,NULL,PostData);

  • ifjpeg.spiを呼び出すプログラムでエラー

    現在、Code Gear C++ Builder 2009 でプログラミングをしていて、ifjpeg.spiというDLLファイルの読み出しプログラムを作成しているのですが、 コマンドボタンを押して、”ProcGetPluginInfo”というデータをとりだすというプログラムなのですが、 [ILINK32 エラー] Error: 未解決の外部参照 '__fastcall TMainForm::CallButtonClick(System::TObject *)' が C:\・・(中略)・・・\VC_TEST\CPP_BUILDER_2009\TEST_PICTURE_VIEW\RELEASE\UNIT1.OBJ から参照されました このようなエラーが出てきます。 解決方法ご存じの方いらっしゃいませんでしょうか? void __fastcall TMainForm::InfoButtonClick(TObject *Sender) { char buf[80]; HINSTANCE hSPI = LoadLibrary(PluginNameEdit->Text.c_str()); //HINSTANCE hSPI = LoadLibrary("ifjpeg.spi"); //HINSTANCE hSPI; //ロードエラー if( hSPI == NULL ){ ShowMessage("プラグインファイルがロードできません"); return; } ProcGetPluginInfo GetPluginInfo = (ProcGetPluginInfo)GetProcAddress(hSPI,"GetPluginInfo"); //アドレス取得エラー if( GetPluginInfo == NULL ){ ShowMessage("Susieプラグインではありません"); FreeLibrary(hSPI); return; } //情報0 GetPluginInfo(0,buf,80); Memo1->Lines->Add(buf); //Memo->Lines->Add(buf); //情報1 GetPluginInfo(1,buf,80); Memo1->Lines->Add(buf); //情報2 for( int i=0; GetPluginInfo(i*2+2, buf, 80) > 0; i++){ Memo1->Lines->Add(buf); GetPluginInfo(i*2+3,buf,80); Memo1->Lines->Add(buf); } FreeLibrary(hSPI); } //---------------------

  • バイナリ形式の読み込み

    void __fastcall TForm1::LoadData() { FILE *fp; int XYData[36000],I; AnsiString A; fp = fopen( "C:\\test1\\¥A.rdt", "rb" ); if( fp == NULL ){ ShowMessage("file open error\n" ); exit( 1 ); fread(XYData,2,70000,fp);         for(I=0;I<3600; I++){ A=XYData[I]; Memo1->Lines->LoadFromFile(A); } fclose(fp); } } これでメモに表示させたかったのですがうまく表示されてません。 読み込めていないのか、使い方が間違ってるのかわからないので指導よろしくお願いします。

  • NavigateとNavigate2の違いは?

    Sub Sample_Navigate() Dim objIE As Object Set objIE = CreateObject("InternetExplorer.application") objIE.Visible = True objIE.Navigate "http://www.yahoo.co.jp/" Set objIE = Nothing End Sub Sub Sample_Navigate2() Dim objIE As Object Set objIE = CreateObject("InternetExplorer.application") objIE.Visible = True objIE.Navigate2 "http://www.yahoo.co.jp/" Set objIE = Nothing End Sub 上記二つのサンプルをテストしてみましたが違いが判りません。 Navigate2のヘルプを見ようとしても キーワードが見つかりません。が見つかりませんになってしまいます。 この二つのメソッドの違いを教えていただけますか? オブジェクトブラウザの情報だと Navigateは Sub Navigate(URL As String, [Flags], [TargetFrameName], [PostData], [Headers]) SHDocVw.InternetExplorer のメンバー Navigates to a URL or file. Navigate2は Sub Navigate2(URL, [Flags], [TargetFrameName], [PostData], [Headers]) SHDocVw.InternetExplorer のメンバー Navigates to a URL or file or pidl. と書いてありました。 引数の数は一緒でした。

  • C-Builder OnChangeをマスク

    C-BuilderでEditのデーターが変化した時、ある処理をしています。 その処理の中で、入力内容が正しく無い時はエラーメッセージを表示させ、Editの内容を入力された以前の状態に戻して居る為、その状態でも再度OnChangeイベントが発生してしまいます。 現在はbInhibitフラグを作って、これをルーチン内でtrueにする事で、再度OnChangeイベントが発生した時にルーチンの最初でreturnさせて二重割り込みを防ごうとしていますが、タイミングによっては二重割り込みが発生してしまいます。 これが内部での変更で無ければ Edit1->Enabled = false; とする事により、二重の割り込みは防げますが、今回はEdit1Changeの中で書き換えを行っている為、これでは二重割り込みを防げません。 何か二重割り込みを防ぐ方法がありましたらお教え下さい。 宜しくお願い致します。 bool bInhibit = false; void __fastcall TForm1::Edit1Change(TObject *Sender) { if( bInhibit == true ) return;   bInhibit = true;   -------- bInhibit = false; } }

  • Delphi XE5をアップデートしたら(2)

    前回アップデートしたら例外処理がおかしくなったという質問をしましたが、 あれから、いろいろやっていたら、exeファイルから実行すると正常にエラーメッセージが出て、RAD Studioから実行すると(デバッグモード?)、ShowMessageのエラーメッセージが出ないことがわかりました。 もしかしたらupdateは関係ないかもわかりません。 (今となっては検証しようがありません) でも、これってデバッガモード(?)の正常な動作なんでしょうか? //前回の質問 Delphi Xe5 Starterを使っています。 今日update2をインストールしたら、動作がおかしくなりました。 プログラムは次の通りです。 ------------------------------------------------- procedure TForm1.TestDoButtonClick(Sender: TObject); var Rep, pattern: string; begin pattern := FindEdit.Text; Rep := ReplaceEdit.Text; try Memo2.Lines.Text := TRegEx.Replace(Memo1.Lines.Text, pattern, Rep, []); except ShowMessage('正規表現にエラーがあります'); end; end; ---------------------------------- たしか、アップデートする前には正規表現にエラーがあれば、「正規表現にエラーがあります」が表示されたはずですが、システム?のエラー表示が出て、プログラムが停止します。 どこか間違ってますか?

  • 秀丸の正規表現用DLLをDelphiから使いたい

    秀丸に同梱されている正規表現処理用DLL、HMJRE.DLLをDelphiで使用しようとしているのですが、 うまくいきません。 実行しようとすると「エントリーポイントが見つかりません」と表示されます。 ---------------------- function dllfuncstr(func:String;find_str:String;target_str:String;start_pos:Integer;replace_str:String;kind:Integer):String; external 'HMJRE.DLL'; ... procedure TForm1.Button1Click(Sender: TObject); var find_str, target_str, replace_str:String; start_pos, kind:Integer; begin find_str := '123'; target_str := Memo1.Lines[0]; start_pos := 0; replace_str := 'abc'; kind := 1;// Memo2.Lines[0]:= dllfuncstr('ReplaceRegularNoCaseSence',find_str,target_str,start_pos,replace_str,1); end; ----- 秀丸のヘルプにマクロから呼び出す場合の例 が次のように記載されています。 $s = dllfuncstr( "ReplaceRegular", "([a-z]+)([0-9]+)", "--abcdefg1234567--", 0, "\\2\\1" ); message $s; DelphiのバージョンはXE5です。

  • DocumentCompleteイベントプロシジャに制御が渡らない

    VB6(VBA)でIEを操作し、表示ページのソースの読込みの確認にDocumentCompleteイベントを使用することを考えています。それで下記のテストプログラムを作成しますたが、DocumentCompleteイベントプロシジャに制御が渡りません。 その原因をご教示して頂きたくお願いします。 Dim WithEvents objIE As InternetExplorer --------------------------------------------------------------- Private Sub CommandButton1_Click() Dim objIE As Object Set objIE = CreateObject("InternetExplorer.application") objIE.Visible = True objIE.Navigate "http://www.yahoo.co.jp/" While objIE.readyState <> 4 While objIE.Busy = True DoEvents Wend Wend objIE.Navigate "http://www.goo.ne.jp/" While objIE.readyState <> 4 While objIE.Busy = True DoEvents Wend Wend End Sub ------------------------------------------------------------- Private Sub objIE_DocumentComplete(ByVal pDisp As Object, URL As Variant) MsgBox "ソースの読込み完了" End Sub

  • EXCELのYEAR関数をOLEで呼ぶには

    いつもお世話になっております。 EXCEL2002を使用しております。 A1セルに日付型のセルがあるとして、 そこに、"2002/12/24"が入っているとします。 このセルから年を取得する場合、 Year(Cells(1,1)) で取得できると思うのですが、 これをOLE経由で取得する場合、どのように呼べばよいでしょうか。 本ケースではDelphi(6.0)上からExcelを呼ぶものとして、 上記の解決方法をご教授いただければと存じます。 以下は、フォーム表示時にExcelを起動、値を設定し、Excelを終了させるソースです。(Excelが保存確認してくるので、Excelはおわりませんが、、) procedure TForm1.FormCreate(Sender: TObject); var objExcel: Variant; BookName:String; strSheetName:String; a :String ; begin objExcel := CreateOleObject('Excel.Application') ; //Excel起動 objExcel.WorkBooks.Add[null] ; objExcel.visible := true ; BookName := objExcel.ActiveWorkBook.Name ; strSheetName :=objExcel.WorkBooks[BookName].WorkSheets[1].Name ; objExcel.WorkBooks[BookName].WorkSheets[strSheetName].Range['A1'].value := 36884 ; //ここで年を取得したいのです。 objExcel.Quit ; objExcel := Unassigned ; end; 他の言語からでの呼び出し方法でもかまいませんので、 どなたかご教授をよろしくお願いいたします。

専門家に質問してみよう