最近 C++/CLI でも Excel を操作したいという質問をよく見ます。
そこでサンプルでも作っておこうかなとおもって、いろいろやってみたのですが、
CLRプロジェクト-Windows フォームアプリケーションのときに、ある条件のときに実行できなくなります。
(コンパイルはできる)
以下そのコードです。Formも立ち上がらずすぐにASSERTします。
(ちなみに、CoInitializeは(何でかはよくわからないけど)不要のようです。)
#import "C:\Program Files\Common Files\Microsoft Shared\OFFICE11\MSO.DLL" \
no_namespace rename("DocumentProperties", "DocumentPropertiesXL") \
rename("RGB", "MSO_RGBXL")
#import "C:\Program Files\Common Files\Microsoft Shared\VBA\VBA6\VBE6EXT.OLB" \
no_namespace
#import "D:\Program Files\Microsoft Office\OFFICE11\EXCEL.EXE" \
rename("ReplaceText", "ReplaceTexXL") rename("CopyFile", "CopyFileXL") \
rename("DialogBox", "DialogBoxXL" ) rename("RGB", "RGBXL")\
rename("DocumentProperties", "DocumentPropertiesXL") \
exclude("IFont") exclude("IPicture") no_dual_interfaces
HRESULT ExcelTest()
{
HRESULT hr = S_OK;
Excel::_ApplicationPtr pApp = NULL;
try
{
hr = pApp.CreateInstance(L"Excel.Application");
if (FAILED(hr)) _com_issue_error(hr);
Excel::WorkbooksPtr pWorkbooks = pApp->GetWorkbooks();
if (pWorkbooks)
{
Excel::_WorkbookPtr pWorkbook = pWorkbooks->Add();
if (pWorkbook)
pWorkbook->Close();
}
pApp->Quit();
}
catch (_com_error& e)
{
hr = e.Error();
}
if (pApp) pApp.Release();
return hr;
}
環境:Visual Studio 2005 Pro SP1/Windows Xp Pro SP2/Excel 2003 Personal SP2
オプション:Unicode 文字セットを使用する, 共通言語ランタイム サポート (/clr)
(一応ソースは分けてあります。(ExcelTest.cpp))
これをCLRコンソールアプリケーションで記述し動かしても何も問題ありません。
で、本題の
>ある条件のときに
とは、引数省略時のvtMissingではなかろうか?と思っています。
上のコードの Excel::Workbooks::Add と Excel::Workbook::Close をコメントアウトすると正常に実行できます。
また、
>Excel::_WorkbookPtr pWorkbook = pWorkbooks->Add();
を
Excel::_WorkbookPtr pWorkbook = pWorkbooks->Add(Excel::xlWBATWorksheet);
にして、Excel::Workbook::Close をコメントアウトしても正常に実行できます。
>pWorkbook->Close();
を
_variant_t v;
pWorkbook->Close(v);
としても実行できません。
ASSERTは
D:\Program Files\Microsoft Visual Studio 8\VC\crt\src\dbgheap.c の 1473 で発生し、ちょっと理解しにくそうなものです。
>_ASSERTE(_CrtIsValidHeapPointer(pUserData));
一応、#pragma unmanged とか、試してみたけど意味なしっぽく、お手上げ状態です、、、
もう少しやってみて、だめなら掲示板にスレたてますかな。
投稿日時 : 2007年1月16日 1:53