Blue Campus
ちょっとした記録

2007年1月16日

最近 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 とか、試してみたけど意味なしっぽく、お手上げ状態です、、、
もう少しやってみて、だめなら掲示板にスレたてますかな。

posted @ 1:53 | Feedback (1771)