トップ回答者
ファイル読み込み時に例外が発生してしまいます

質問
-
現在、MSXMLを利用してXMLファイルの読み込みを行う機能を作成しています。
インスタンスの作成まではできたのですが、肝心のXMLファイルをloadすると、Exceptionが発生してしまいました。
正常にloadし要素を取得するには、どのように解決すれば良いでしょうか。
------------------------------------------------------------
#include <objbase.h>
#include <atlbase.h>
#include <comutil.h>
#include <comdef.h>
#include "StdAfx.h"
#include "msxml2.h"
#import "msxml3.dll" named_guids raw_interfaces_only
int WINAPI WinMain(HINSTANCE n_hInstance, HINSTANCE n_hPrevInstance, LPTSTR npCmdLine, int nCmdShow)
{
short sResult = FALSE;
HRESULT hr;
VARIANT_BOOL hr2;
hr = CoInitializeEx(NULL, COINIT_MULTITHREADED);
IXMLDOMDocument2 *pXmlDoc = NULL;
hr = CoCreateInstance(CLSID_DOMDocument,NULL,CLSCTX_INPROC_SERVER,IID_IXMLDOMDocument2,(void**)&pXmlDoc);
hr = pXmlDoc->put_async(VARIANT_FALSE);
hr2 = pXmlDoc->load(_variant_t(L"\\Temp\\Sample.xml"), &sResult); // <-ここでException
// 以下要素取得等…
}
-------------------------------------------------------
Exception ffffffe0 Thread=8ec0dd08 Proc=6ecb297a 'XML_Parser.exe'
AKY=00001001 PC=03a6c56a(msxml3.dll+0x0001c56a) RA=8830e156(NK.EXE+0x0000e156) TEA=03a6cf16
TLSKERN_NOFAULT set... bypassing kernel debugger.
First-chance exception in XML_Parser.exe: 0xE0000001: (no name).
環境は、eMbedded Visual C++です。
また、中身を空でsave()を実行すると指定場所にが作成されますが、何かしら要素を入れてsave()を行うと、同様に例外が
発生してしまいました。
回答
-
Azuleanさん
ご指摘ありがとうございます。
Windows CE フォーラムにて質問を記載しましたので、こちらのスレッドはクローズいたします。
#Windows CE フォーラムでの質問リンク先
http://social.msdn.microsoft.com/Forums/ja-JP/windowsceja/thread/a2f70735-3788-40a8-b771-0e429b63b1c0
すべての返信
-
相対URL のカレントディレクトリの指定って( \ でも / でもいいけど)
L"\\Temp\\Sample.xml"
でなく
L".\\Temp\\Sample.xml"
か
L"Temp\\Sample.xml"
でなかったですかね。
/ から始めると相対位置でも
ルート(例えば http://social.msdn.microsoft.com/ )からの相対位置ですよね。
cf. RFC1808
あと,関係ないと思うけど,
デフォルトだと,デバッグ時のカレントディレクトリは
Debugフォルダでなく,その上のプロジェクト名のフォルダです。
# ここに写したときにパスを省略しただけなら
# 原因は他でしょうが。
稍丼 / yayadon -
yayadonさん
返信ありがとうございます。
load()にて指定するパスは絶対パスだったと思いますが、もしかして指定の仕方が間違っているのでしょうか?
hr2 = pXmlDoc->load(_variant_t(L"\\Temp\\Sample.xml"), &sResult);
L".\\Temp\\Sample.xml"
L"Temp\\Sample.xml"
共に、確認してみたのですが、同様にExceptionが出てしまいました。
ちなみに、実行ファイルとファイルの位置関係は以下の通りです。
XML_Parser.exe
Temp
|-Sample.xml
XML_Parser.exeはrootにあります。
#save()実行時にも保存場所を指定しますが、上記の指定方法でファイルは作成されていました。 -
> 環境は、eMbedded Visual C++です。
ということは対象はWindowsCEだと思います。であれば最低でもOSバージョンは明記すべきです。
出来れば使用している端末も明記したほうがいいですが、守秘義務などがあるなら仕方ありません。
またWindowsCEはベンダが自由に機能を選択できるのですが(MSXML 3.0を組み込まないことも可能)
そういった部分に問題ないでしょうか?
なおWindowsCEにはドライブレターやカレントフォルダの概念(というか機能自体)がないので
ファイル名は\から始まるフルパスで書くことになります。
このあたりはWindowsCEへの移植の際に引っかかりやすい部分です。
あと提示されたコードではエラーチェックをしていないようですが大丈夫でしょうか?
#ここではなくてWindowsCEフォーラムの方が質問先として適当かも? -
ホーミンさん
返信ありがとうございます。
おっしゃる通り、対象はWindowsCEとなっております。
OSのバージョンですが、5.0となっています。
>なおWindowsCEにはドライブレターやカレントフォルダの概念(というか機能自体)がないので
>ファイル名は\から始まるフルパスで書くことになります。
上記コードで指定しているパスは問題なしと捉えてよいのでしょうか?
>あと提示されたコードではエラーチェックをしていないようですが大丈夫でしょうか?
実際のコードには、エラーチェックを入れています。
(イニシャライズ・インスタンス作成時等のチェックはいれてあります。)
#WindowsCEフォーラムにも質問をいれてみたいと思います。 -
Azuleanさん
ご指摘ありがとうございます。
Windows CE フォーラムにて質問を記載しましたので、こちらのスレッドはクローズいたします。
#Windows CE フォーラムでの質問リンク先
http://social.msdn.microsoft.com/Forums/ja-JP/windowsceja/thread/a2f70735-3788-40a8-b771-0e429b63b1c0