お世話になります。
知識を身に付けたく、他でも同じ質問をしていますお許し下さい。
表題の件でプログラムレビューでつこまれ、何も答えられなかった自分
に反省し、ただコピーるだけでなく、解析する事をしましたが、
分らなかった箇所があったり、間違った解釈をしてるか、教えてもらいたく投稿しまし
た。
また処理が終了しますと『ハンドルされていない例外はBoot.exe(OLE32.DLL)にありま
す』
OnInitDialog();でも::CoInitialize(NULL);すると直ります。2箇所でやらないとダメ
な理由が分りません。
基礎が出来ていなくお忙しい所お手数かけますが
よろしくお願い致します。
COleVariant・・・エクセルなど他のアプリケーションを使用する時に
しようする。
http://www.int21.co.jp/pcdn/vb/noriolib/vbmag/6/oleabs/oleabs.html
http://msdn2.microsoft.com/ja-jp/library/x8be74z8.aspx
_ApplicationPtr・・・エクセルを実体化する為に必要
http://72.14.235.104/search?
q=cache:H4IR8Qghs0AJ:park15.wakwak.com/~opapa/xml/Office.htm+_ApplicationPtr&hl
=ja&gl=jp&ct=clnk&cd=3
VC++6.0
ダイアログベース
Excel 2000
<ヘッダーファイル>
// BootMacro.h: CBootMacro クラスのインターフェイス
//
//////////////////////////////////////////////////////////////////////
#pragma warning(disable : 4146 4192)// この原因もよく分らず・・
#import C:\Program Files\Microsoft Office\Office\Mso9.dll no_namespace rename
(DocumentProperties, DocumentPropertiesXL)
#import C:\Program Files\Common Files\Microsoft Shared\VBA\VBA6\Vbe6ext.olb
no_namespace
#import C:\Program Files\Microsoft Office\Office\excel9.olb rename
(DialogBox, DialogBoxXL) rename(RGB, RBGXL) rename
(DocumentProperties, DocumentPropertiesXL) no_dual_interfaces
#if !defined(AFX_BOOTMACRO_H__C4BC2D91_FAAE_4125_B957_87EEC0E83C33__INCLUDED_)
#define AFX_BOOTMACRO_H__C4BC2D91_FAAE_4125_B957_87EEC0E83C33__INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif // _MSC_VER > 1000
class CBootMacro
{
private:
Excel::_ApplicationPtr pXL; // ポインター
Excel::WorkbooksPtr pBooks; // ポインター
HRESULT m_hr;
public:
CBootMacro();
virtual ~CBootMacro();
bool Start(/*CString* test_path1*/);
bool End();
};
自分の理解をコメントしています。
間違っていましたらご指摘お願いします。
<cppファイル>
// BootMacro.cpp: CBootMacro クラスのインプリメンテーション
#include stdafx.h
#include boot.h
#include BootMacro.h
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
////////////////////////////////////////////////////////////////
// 構築/消滅
////////////////////////////////////////////////////////////////
CBootMacro::CBootMacro()
{
//com を使う時はイニシャライズをする
::CoInitialize(NULL);
pXL = NULL;
pBooks = NULL;
}
CBootMacro::~CBootMacro()
{
// 生成したアプリケーション解放
pXL.Release();
::CoUninitialize();
}
////////////////////////////////////////////////////////////////
// マクロ起動
////////////////////////////////////////////////////////////////
bool CBootMacro::Start(/*CString* test_path1*/)
{
using namespace Excel; //名前空間の定義
COleVariant cdata;
//Excelの起動
pXL.CreateInstance(LExcel.Application); //アプリケーションの生成
//WorkBookを追加する(ここがHPを見ましたが理解できていない)
pBooks = pXL->Workbooks;
try
{ // 「_WorkbookPtr pBook これはどこにも使ってないから、この処理はいらな
いのでは」
// と言われ何も答えられませんでした
_WorkbookPtr pBook = pBooks->Open(C:\\SWD\\AutoMation-3
\\Debug\\format5.xls);//ドキュメントを開く
}
catch(_com_error& e)
{ //本来こうしたいのだが↓・・・_com_error* eでもダメ
//e->Delete();
}
//確認メッセージ(MessageBox等)の表示の無効化
pXL->DisplayAlerts = FALSE;
//マクロ名を格納(SetString(マクロ名, VT_BSTR(これは決まり?)))
cdata.SetString(READ_TextFile,VT_BSTR);
try
{ // _Run2 関数の仕様がgoogleに載ってなかった
m_hr = pXL->_Run2(cdata);
}
catch(...)//現状はこの形でcatch
{
return false;
}
return true;
}
////////////////////////////////////////////////////////////////
// マクロ終了
////////////////////////////////////////////////////////////////
bool CBootMacro::End()
{
//ファイルを閉じる
pBooks->Close();
//マクロの終了
if((m_hr = pXL->Quit()) != 0)
{
return false;
}
return true;
}
なんで移動したの?こういう行為はマルチポストとして非常に礼儀知らずの行為です。
http://forums.belution.com/ja/vc/000/366/60.shtml
どうしも今日中に報告しなくてはいけなく、また初心者で聞きすぎたので
もう教えてもらえなとか思い、あせりもあり失礼は承知で移動しました。
申し訳ありません。
今でも自分で調べているのですが
http://www.ujasiri.com/prglib/vc/excel/vc_excel.html
やはりソースをみただけでは、何も答えられなかった箇所については
わからず、途方にくれています。
マナー違反で申し訳ない行為をしたことは謝罪します。
『申し訳ありませんでした』
理解の間違いがあればアドバイスよろしくお願い致します。
>どうしも今日中に報告しなくてはいけなく、また初心者で聞きすぎたので....
これきちんと、
http://forums.belution.com/ja/vc/000/366/60.shtml
で説明しないといけないですね。
事情を説明すれば大丈夫だと思います。
http://forums.belution.com/ja/vc/000/366/60.shtml
のところでもう一度聞いて見るのもいいと思います。
それで、これ以上回答できないとの話なら、きちんと宣言して、
ここでスレ作ってもいいと思います。
> どうしも今日中に報告しなくてはいけなく、
> また初心者で聞きすぎたのでもう教えてもらえなとか思い、
> あせりもあり失礼は承知で移動しました。申し訳ありません。
# 追い詰められてあせる気持ちもわかりますが、今日中に、とかいうのは回答者には
# 関係の無いご自身の都合です。初心者というのも理由にはなりません。
# 聞き方にもよりますが、「失礼を承知でマルチポスト」するよりは同じ掲示板で
# 継続する方が、よほど心象はいいと思います。
# 知っててやるってことは「自分の都合が満たせれば他人に失礼だろうがどうでもい
い」
# と宣言してるようなものですし。
# 各掲示板の他の回答を見てれば、回答者はかなりかぶっていることはわかりますし。
ITOさんがいわれたとおり、最初の場所で謝罪をしました。
助けてもらえるように努力します。
Banさんの言う通りだと思います。今後は二度とこのような事はしません。
申し訳ありませんでした。
申し訳ありませんでした。