2009-04-03 47 views
2

Excel 2003ファイルからデータを自動的に読み取るバックグラウンドサービスアプリケーションを作成しています。しかし、私が何を試みても、メソッドOlePropertyGet()は、アドレス "00000800"から読み取ろうとすると、常にEAccessViolationエラーが発生します。C++、OLE、Excelオートメーション:00000800のアクセス違反

エラーは、常にこのコードスニペットの最後の行で発生し、メソッドが受け取るパラメータかの独立したようだ:私はこの上でいくつかの大規模なGoogle検索を行ってきた

Variant excel, workbooks; 

try 
{ 
    excel = GetActiveOleObject("Excel.Application"); 
} 
catch(...) 
{ 
    excel = CreateOleObject("Excel.Application"); 
} 

workbooks = excel.OlePropertyGet("Workbooks"); 

、それでもだ、何も見つかりませんでした遠方に役立つ、thisフォーラムのスレッド誰かが同じ問題を抱えているが、原因や解決策についての情報を与えていない(ある時点で、彼は原因を知っていると言いますが、 !)。

この問題の原因とその解決方法については、私は何か考えていますが、Excel OLEオートメーションの代替方法もあります。

+0

アプリケーションでは0x800番地に読み取ろうとした場合、これはあまりにも良い見ていません。 – ALOToverflow

答えて

1

Office用Visual Studioツールを使用できます(http://msdn.microsoft.com/en-us/library/d2tx7z6d.aspxを参照)。

また、ATLサポートを使用して、オフィスが提供するオブジェクトモデルをインスタンス化することもできます。

2

私の推測では、GetActiveOleObject()CreateOleObject()どちらも働いていたように見えます。..

そのNULLポインタの問題です。

OlePropertyGetを呼び出す前に、「Excel」の有効性をチェックしてみてください。

Excelをインストールしていることを確認してください。

0

コードが "Excel.Application"を正常に解決できない場合があります。これは、NULLポインタにつながります。その文字列でレジストリ検索を使用してExcelを識別します。そのレジストリエントリが見つからないようです。

0

私は(C++ Builderで)作成されたオブジェクトの妥当性を判断するために、このようなコードを使用します。

Varaint excel = GetActiveOleObject("Excel.Application"); 
TAutoDriver<IDispatch> dispatcher; 
dispatcher.Bind(excel, false); 

if (dispatcher.IsBound()) 
{ 
    Variant workbooks = excel.OlePropertyGet("Workbooks"); 
} 
関連する問題