- PR -

属性を取得したい

投稿者投稿内容
ぽち
常連さん
会議室デビュー日: 2005/05/24
投稿数: 25
投稿日時: 2005-08-15 21:11
冬寂さん、度々レスありがとうございます。

引用:

引用:

で、実際にC++で使う場合には、
BSTRラッパ文字列クラスを使ってしまうと楽だと思います。
map->getNamedItem(_bstr_t(L"属性名"))
または、
map->getNamedItem(CComBSTR(L"属性名"))
ちなみに、'L' は、ユニコード文字列を表します。


と書いてあった箇所は試してみましたか?



#以下、VC++の話になってしまい、恐縮です。
コンパイル時に、勝手に作成された「msxml4.tlh」というものを覗いてみました。

IXMLDOMNodePtr getNamedItem(_bstr_t name);
と書いてあり、pAttrNodeが返って来るようです。

そこで、その戻って来た値を使い
pAttrNode->get_nodeValue( &val );
として、nodeValue()を呼んでみました。
すると、上記実行時に「ハンドルされていない例外は、hoge.exe(MSXML3.DLL)にあります:0xC0000005:Access Violation。」となってしまいました。
ソースの先頭で、
#import "msxml4.dll"
と記述しているのに、なぜMSXML3.DLLとなってしまったのでしょう?

これについて、どなたかご存知の方いらっしゃいますか?
#XMLということに限らず、どのDLLが呼ばれるのかという一般的な質問という
#ことで、VC系の掲示板に質問した方が賢明でしょうか?
#悪気はないが、マルチポストだらけになるようで、ちょっと気がひける。
未記入
常連さん
会議室デビュー日: 2005/07/04
投稿数: 31
投稿日時: 2005-08-15 21:27
明らかにコード云々じゃなくて環境作りに失敗してるんだから

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/xmlsdk/html/6b545726-8637-481a-934c-874617c2004c.asp

http://msdn.microsoft.com/library/en-us/xmlsdk/html/def1c84a-6f8a-4b4d-b919-d1a703118214.asp

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/xmlsdk/html/02b48be9-c278-4125-8fb5-f5d975173543.asp

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/xmlsdk/html/5d43fb06-f723-451d-b00d-6727dfe862aa.asp

ヨメ

上のアドレス失敗なきがする

To install MSXML manually

Copy the DLLs to the system directory on your working machine.
Register the DLLs by typing the following at a command prompt:
cd c:\windows\system32
regsvr32 msxml4.dll



To include headers and libraries automatically

Add the following two lines to your source code:
#import <msxml4.dll> raw_interfaces_only
using namespace MSXML2;

もし手動でインクルードするなら
Include the required MSXML header file by inserting the following macro into the source code:
#include <msxml2.h>

Link msxml2.lib to your project. To do this in Visual C++, open Project Settings by clicking Settings from the Project menu. Select the Link tab. Append "msxml2.lib" to the Object/library modules: textbox.


[ メッセージ編集済み 編集者: 未記入 編集日時 2005-08-15 21:35 ]
ぽち
常連さん
会議室デビュー日: 2005/05/24
投稿数: 25
投稿日時: 2005-08-15 21:30
未記入さん、レスありがとうございます。

引用:

未記入さんの書き込み (2005-08-15 20:47) より:
$ cat msxml1.cpp
#include <msxml2.h>
int main(){
IXMLDOMNamedNodeMap* map;
BSTR name;
IXMLDOMNode* pAttrNode;
map->getNamedItem( name, &pAttrNode );
return 0;
}

このコードでコンパイルとおらないなら
includeするものがまちがってるのでは?



msxml2.hが入っていないので、コンパイルが通りませんでした。
どこのサイトだったか忘れましたが、最初に参考にした(属性の読込をしていない)
ところでは、ヘッダをincludeしていませんでした。
#import "msxml4.dll"とインポートだけでした。
ヘッダが必要なのでしょうか?
ぽち
常連さん
会議室デビュー日: 2005/05/24
投稿数: 25
投稿日時: 2005-08-16 21:19
未記入さん、レスありがとございます。

引用:

To install MSXML manually

Copy the DLLs to the system directory on your working machine.
Register the DLLs by typing the following at a command prompt:
cd c:windowssystem32
regsvr32 msxml4.dll



To include headers and libraries automatically

Add the following two lines to your source code:
#import <msxml4.dll> raw_interfaces_only
using namespace MSXML2;

もし手動でインクルードするなら
Include the required MSXML header file by inserting the following macro into the source code:
#include <msxml2.h>

Link msxml2.lib to your project. To do this in Visual C++, open Project Settings by clicking Settings from the Project menu. Select the Link tab. Append "msxml2.lib" to the Object/library modules: textbox.



上記を参考に、現在試行錯誤中です。

regsvr32で、msxml4.dllを登録(successと表示された)後に、実行しても
「ハンドルされていない例外は、hoge.exe(MSXML3.DLL)にあります:0xC0000005:Access Violation。」となってしまいました。
またregsvr32 /uで、msxml3.dllを解放(successと表示された)後に、実行しても同様でした。
#なぜか、msxml4.dllは呼ばれないようです。

またMSXML4.0(SP2)を
http://www.microsoft.com/downloads/details.aspx?FamilyID=3144b72b-b4f2-46da-b4b6-c5d7485f2b42&DisplayLang=ja
よりDLし、手動でインクルードする方法で、先日教えていただいたサンプルコードをコンパイルしてみたところ、コンパイルエラーは発生しませんでした。
で気を良くして、この方法に乗り換えて実際にエレメント・属性の取得をしてみようとしたのですが、
using namespace MSXML2;
の部分で、「error C2871: 'MSXML2' : 存在しないか名前空間ではありません。」となってしまい、以下それに伴うと思われるエラーが多数出る状況になってしまいました。
あちこサイトを検索してみたところ、namespaceは「msxml.dllはMSXML」「msxml2.dll〜msxml4.dllは、MSXML2」と書いてあったのですが何がまずいんでしょう?
#XMLはもちろんのことnamespaceについても、よくわからない状態なので
#何をどうしてよいものやら・・・

どうも状況が混乱してきて、自分でも整理つかない状態ですが、とりあえずご報告まで。
goma
会議室デビュー日: 2005/08/17
投稿数: 2
投稿日時: 2005-08-17 02:38
こんにちは。

自分はJavaScriptを知っている程度のレベルですので、間違った発言が
あるかもしれないので、予めご了承ください。

ぽち さんが作成されているのはクライアント向けのアプリケーション
ですか?
(Windows2000の場合ですが、Internet Explorer 6 のインストールで
MSXML3 がインストールされ、MSXML4 は別にダウンロード、インストール
する必要がある。ということはご理解されてますか?)

また、regsvr32 msxml4.dll することはDLLファイルをレジストリに
登録することであって、「インクルード」する作業ではないことは
ご理解されてますか?

未記入 さん提示の4つのMSDNへのリンクはすべて読んでますか?


■ To include headers and libraries automatically
  http://msdn.microsoft.com/library/default.asp?url=/library/en-us/xmlsdk/html/def1c84a-6f8a-4b4d-b919-d1a703118214.asp

regsvr32 msxml3.dll の場合
==============================================
#import <msxml3.dll> raw_interfaces_only
using namespace MSXML2;
==============================================

regsvr32 msxml4.dll の場合、
==============================================
#import <msxml4.dll> raw_interfaces_only
using namespace MSXML2;
==============================================

正しく記述してますか?


■ To include headers and libraries manually
  http://msdn.microsoft.com/library/default.asp?url=/library/en-us/xmlsdk/html/5d43fb06-f723-451d-b00d-6727dfe862aa.asp

 1から5を正確に実行してみましたか?



環境が整ったと仮定して...

そもそも「属性を取得したい」→「属性の値を取得したい」とのことでしたね。
下記リンクのページに記載されている getNamedItemメソッド のサンプルコードは
参考にされてますか?

  http://msdn.microsoft.com/library/default.asp?url=/library/en-us/xmlsdk/html/f558c38c-1d57-4915-9ea3-55f986436847.asp
ぽち
常連さん
会議室デビュー日: 2005/05/24
投稿数: 25
投稿日時: 2005-08-19 12:46
gomaさん、レスありがとうございます。

引用:

ぽち さんが作成されているのはクライアント向けのアプリケーション
ですか?


スタンドアロンで動作するアプリケーションです。
現在試行錯誤して開発中なので、今後ファイル構造がガンガン変わる可能性があるため、xmlのようにデータにタグがあればデータの書込みの順番その他が変わっても容易に対応できるかな・・・と思いまして。

引用:

(Windows2000の場合ですが、Internet Explorer 6 のインストールで
MSXML3 がインストールされ、MSXML4 は別にダウンロード、インストール
する必要がある。ということはご理解されてますか?)


そう言われてみればそうでした。
先日、あるソフトを動かす時にMSXML4を別にダウンロードしたっけ。
ということで、MSXML3を使うように変更しました。

引用:

また、regsvr32 msxml4.dll することはDLLファイルをレジストリに
登録することであって、「インクルード」する作業ではないことは
ご理解されてますか?


これなら、解ってます。(^^ゞ
#DLLなんて、便利なようで不便なようで。
#あ〜、DOSは良かったなぁ。(いまだにそんな事言ってるのか!)

引用:

未記入 さん提示の4つのMSDNへのリンクはすべて読んでますか?


読みました。が、英語なので私の解釈が正しいか・・・

で、またまたあれこれやってみました。
msxml3.dllを利用する方法で、属性を取得することができました。
以下、主要部分の一部(ごめんなさい、色々試したらソースがきたな過ぎて全部載せられません)を掲載します。

------------------
#import "msxml3.dll"
using namespace MSXML2;

IXMLDOMNamedNodeMap* map;
IXMLDOMAttributePtr pAttributeX = map->getNamedItem(_bstr_t(L"x"));
buf = pAttributeX->Gettext();
------------------

前回の投稿時、getNamedItem()の戻り値をIXMLDOMNode*型の変数で受けていたのがマズかったみたいです。
とりあえず、お試しソフトでの読書きはできたので、これから本チャンアプリをXML形式に対応させてみたいと思います。
#他の部分とのからみで、不都合が発生しませんように・・・

みなさん、アドバイスありがとうございました。
未記入
常連さん
会議室デビュー日: 2005/07/04
投稿数: 31
投稿日時: 2005-08-21 05:04
msxmlでのFAQになりそうなネタなので書いておきます
まずぽちさんが最初になぜコンパイルエラーになったかというとおそらく
#import <msxml4.dll> raw_interfaces_only
ではなく
#import <msxml4.dll>
というディレクティブだったからだと思います
これによってgetNamedItemのプロトタイプは
HRESULT __stdcall getNamedItem (
BSTR name,
struct IXMLDOMNode * * namedItem )
ではなく
IXMLDOMNodePtr getNamedItem (
_bstr_t name );
になっています(理由も知らないしドキュメントに記載は無い)

コメントに
//
// Wrapper methods for error-handling
//


MSDNに

raw_interfaces_only 属性は、エラー処理ラップ関数とその関数を使う __declspec(property) 宣言の生成を抑制します。

raw_interfaces_only 属性を指定すると、非プロパティ関数の名前付けに使われるデフォルトのプレフィックスも削除されます。デフォルトのプレフィックスは raw_ です。この属性を指定すると、タイプ ライブラリの関数名が直接使われます。

この属性を指定すると、タイプ ライブラリの低水準の内容だけを公開できます。

と書いてあるのでそういうことなのでしょう

ぽち
常連さん
会議室デビュー日: 2005/05/24
投稿数: 25
投稿日時: 2005-08-25 11:43
未記入さん、レスありがとうございます。

引用:

まずぽちさんが最初になぜコンパイルエラーになったかというとおそらく
#import <msxml4.dll> raw_interfaces_only
ではなく
#import <msxml4.dll>
というディレクティブだったからだと思います
これによってgetNamedItemのプロトタイプは
HRESULT __stdcall getNamedItem (
BSTR name,
struct IXMLDOMNode * * namedItem )
ではなく
IXMLDOMNodePtr getNamedItem (
_bstr_t name );
になっています(理由も知らないしドキュメントに記載は無い)


なるほど。

引用:

raw_interfaces_only 属性は、エラー処理ラップ関数とその関数を使う __declspec(property) 宣言の生成を抑制します。

raw_interfaces_only 属性を指定すると、非プロパティ関数の名前付けに使われるデフォルトのプレフィックスも削除されます。デフォルトのプレフィックスは raw_ です。この属性を指定すると、タイプ ライブラリの関数名が直接使われます。

この属性を指定すると、タイプ ライブラリの低水準の内容だけを公開できます。


これ、実は読みました。
が・・・、なんとな〜く解る(いやほとんど解っていない)状態だったので
raw_interfaces_onlyを付けたり、コメントにしたりして試してました。
で、付けるとコンパイルエラーがいっぱい出たので「こりゃ不要だろう」と
予想して(?)、付けずにやってました。
ということで、実はコレ未だに内容をはっきり理解できていないんです。

スキルアップ/キャリアアップ(JOB@IT)