M
mjoe
I'm trying to show the Excel SaveAs dialog from an ATL app.
In VB, the following works fine:
Application.Dialogs("xlDialogSaveAs").Show sFileName
But in ATL, I've had all sorts of trouble with getting this
to work. Here's what I have right now:
CComPtr<IDispatch> m_pExcel;
HRESULT hr = m_pExcel.CoCreateInstance(L"Excel.Application", NULL,
CLSCTX_SERVER);
CComDispatchDriver cddExcel = m_pExcel;
CComVariant vTrue(TRUE);
hr = cddExcel.PutPropertyByName(L"Visible",&vTrue);
CComVariant cvDialogs;
cddExcel.GetPropertyByName(L"Dialogs", &cvDialogs);
CComDispatchDriver cddDialogs = cvDialogs.pdispVal;
CComVariant cvCount;
hr = cddDialogs.GetPropertyByName(L"Count",&cvCount);
DISPID dwDispID;
hr = cddDialogs.GetIDOfName(L"Item", &dwDispID);
CComVariant cvIndex(5); //xlDialogSaveAs
DISPPARAMS dispparams = { (VARIANT*)&cvIndex, NULL, 1, 0 };
CComVariant cvDialog;
cddDialogs->Invoke(dwDispID, IID_NULL,
LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET | DISPATCH_METHOD,
&dispparams, &cvDialog, NULL, NULL);
CComDispatchDriver cddDialog = cvDialog.pdispVal;
CComVariant vOpt(DISP_E_PARAMNOTFOUND, VT_ERROR);
CComVariant cvResult;
VARIANT vArgsShow[30];
memset(vArgsShow, 0, sizeof(VARIANT) * 30);
for(int i=0;i<30;i++)
{
vArgsShow = vOpt;
}
CComVariant cvDocText("C:\\testing.xls");
vArgsShow[29] = cvDocText; //document_text
CComVariant cvTypeNum(1);
vArgsShow[28] = cvTypeNum; //type_num
CComVariant cvProtPwd("");
vArgsShow[27] = cvProtPwd; //prot_pwd
CComVariant cvBackup(FALSE);
vArgsShow[26] = cvBackup; //backup
CComVariant cvWriteResPwd("");
vArgsShow[25] = cvWriteResPwd; //write_res_pwd
CComVariant cvReadOnlyRec(FALSE);
vArgsShow[24] = cvReadOnlyRec; //read_only_rec
hr = cddDialog.InvokeN(L"Show", vArgsShow, 30, &cvResult);
return 0;
The excel instance starts up fine, I get the Dialogs object,
it has a count of over 700 dialogs, and I'm able to get the
dialog xlDialogSaveAs.
However, I can't get the invoke of the Show method to work.
I've tried all optional parms, just filename, parameters in
forward and backward order, all parameters. Nothing seems
to work.
Anybody have any ideas whats wrong here?
Thanks,
-M-
In VB, the following works fine:
Application.Dialogs("xlDialogSaveAs").Show sFileName
But in ATL, I've had all sorts of trouble with getting this
to work. Here's what I have right now:
CComPtr<IDispatch> m_pExcel;
HRESULT hr = m_pExcel.CoCreateInstance(L"Excel.Application", NULL,
CLSCTX_SERVER);
CComDispatchDriver cddExcel = m_pExcel;
CComVariant vTrue(TRUE);
hr = cddExcel.PutPropertyByName(L"Visible",&vTrue);
CComVariant cvDialogs;
cddExcel.GetPropertyByName(L"Dialogs", &cvDialogs);
CComDispatchDriver cddDialogs = cvDialogs.pdispVal;
CComVariant cvCount;
hr = cddDialogs.GetPropertyByName(L"Count",&cvCount);
DISPID dwDispID;
hr = cddDialogs.GetIDOfName(L"Item", &dwDispID);
CComVariant cvIndex(5); //xlDialogSaveAs
DISPPARAMS dispparams = { (VARIANT*)&cvIndex, NULL, 1, 0 };
CComVariant cvDialog;
cddDialogs->Invoke(dwDispID, IID_NULL,
LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET | DISPATCH_METHOD,
&dispparams, &cvDialog, NULL, NULL);
CComDispatchDriver cddDialog = cvDialog.pdispVal;
CComVariant vOpt(DISP_E_PARAMNOTFOUND, VT_ERROR);
CComVariant cvResult;
VARIANT vArgsShow[30];
memset(vArgsShow, 0, sizeof(VARIANT) * 30);
for(int i=0;i<30;i++)
{
vArgsShow = vOpt;
}
CComVariant cvDocText("C:\\testing.xls");
vArgsShow[29] = cvDocText; //document_text
CComVariant cvTypeNum(1);
vArgsShow[28] = cvTypeNum; //type_num
CComVariant cvProtPwd("");
vArgsShow[27] = cvProtPwd; //prot_pwd
CComVariant cvBackup(FALSE);
vArgsShow[26] = cvBackup; //backup
CComVariant cvWriteResPwd("");
vArgsShow[25] = cvWriteResPwd; //write_res_pwd
CComVariant cvReadOnlyRec(FALSE);
vArgsShow[24] = cvReadOnlyRec; //read_only_rec
hr = cddDialog.InvokeN(L"Show", vArgsShow, 30, &cvResult);
return 0;
The excel instance starts up fine, I get the Dialogs object,
it has a count of over 700 dialogs, and I'm able to get the
dialog xlDialogSaveAs.
However, I can't get the invoke of the Show method to work.
I've tried all optional parms, just filename, parameters in
forward and backward order, all parameters. Nothing seems
to work.
Anybody have any ideas whats wrong here?
Thanks,
-M-