Probleme d'en Pied de page Excel par VC++ 6.0

1 post / 0 new
domdelap
Probleme d'en Pied de page Excel par VC++ 6.0

Bonjour,

L'integration d'informations dans l'EnPied de Page d'une feuille Excel fait un peu n'importe quoi.
Ce source pilote juste l'enpiied de Page, il ne pose aucune valeur dans la feuille Excel.

Dans l exemple joint
j'essaie de mettre :
le nom de fichier a gauche, ca marche (&F)
la date et l heure au milieu, ca fait rien (&D &T)
la page en cours et le nombre de page a droite (&N &P) , ca met la page en cours et ca remet le nom du fichier ( !!! )

Je joins le source a integrer dans le Bouton OK d un projet MFC Dialog Based.
La fonction AutoWrap a ete tirée telle quelle de MSDN

Aucune erreur a la compil, aucune erreur a l execution.

Si quelqu'un a une idée...

void CTestExcelDlg::OnOK()
{

// Initialise COM
CoInitialize(NULL);

// Lit le CLSID du serveur
CLSID clsid;
if(FAILED(CLSIDFromProgID(L"Excel.Application", &clsid)))
{
return ;
}

IDispatch * Excel_ID;

// Lance le serveur
if(FAILED(CoCreateInstance(clsid, NULL, CLSCTX_LOCAL_SERVER, IID_IDispatch, (void **) &Excel_ID)))
{
return ;
}

// Recupere les classeurs
COleVariant result;
AutoWrap(DISPATCH_PROPERTYGET, &result, Excel_ID, L"Workbooks", 0);
IDispatch * Classeurs_ID = result.pdispVal;

// Ajoute un classeur
AutoWrap(DISPATCH_PROPERTYGET, &result, Classeurs_ID, L"Add", 0);
IDispatch * Classeur_ID = result.pdispVal;

// Recupere la Feuille Courante
AutoWrap(DISPATCH_PROPERTYGET, &result, Classeur_ID, L"ActiveSheet", 0);
IDispatch * Feuille_ID = result.pdispVal;

// Recupere l'objet "pagesetup"
AutoWrap(DISPATCH_PROPERTYGET, &result, Feuille_ID, L"PageSetup", 0);
IDispatch * PageSetup_ID = result.pdispVal;

// Nom de fichier dans l'en pied gauche
CString cstrNomPropriete = "LeftFooter";
COleVariant ValeurCOleVariant = "&F";
USHORT * Tampon = cstrNomPropriete.AllocSysString();
AutoWrap(DISPATCH_PROPERTYPUT, NULL, PageSetup_ID, Tampon, 1, ValeurCOleVariant);
SysFreeString(Tampon);

// Date Heure dans l'en pied central
cstrNomPropriete = "CenterFooter";
ValeurCOleVariant = "&D &T";
Tampon = cstrNomPropriete.AllocSysString();
AutoWrap(DISPATCH_PROPERTYPUT, NULL, PageSetup_ID, Tampon, 1, ValeurCOleVariant);
SysFreeString(Tampon);

// Page / Pages dans l'en pied droit
cstrNomPropriete = "RightFooter";
ValeurCOleVariant = "&P &N";
Tampon = cstrNomPropriete.AllocSysString();
AutoWrap(DISPATCH_PROPERTYPUT, NULL, PageSetup_ID, Tampon, 1, ValeurCOleVariant);
SysFreeString(Tampon);


// Sauvegarde
COleVariant CheminVariant = "C:\\essai.xls";
COleVariant Retour;
AutoWrap(DISPATCH_METHOD, &Retour, Feuille_ID, L"SaveAs", 1, CheminVariant );

// Termine Excel
AutoWrap(DISPATCH_METHOD, NULL, Excel_ID, L"Quit", 0);

Feuille_ID->Release();
Classeur_ID->Release();
Classeurs_ID->Release();
Excel_ID->Release();

}

//
// AutoWrap() - Automation helper function...
//
HRESULT AutoWrap(int autoType, COleVariant *pvResult, IDispatch *pDisp, LPOLESTR ptName, int cArgs...)
{
va_list marker;
va_start(marker, cArgs);

ASSERT(pDisp!=NULL);

// Variables used...
DISPPARAMS dp = { NULL, NULL, 0, 0 };
DISPID dispidNamed = DISPID_PROPERTYPUT;
DISPID dispID;
HRESULT hr;
CString buf;
char szName[200];


// Convert down to ANSI
WideCharToMultiByte(CP_ACP, 0, ptName, -1, szName, 256, NULL, NULL);

// Get DISPID for name passed...
hr = pDisp->GetIDsOfNames(IID_NULL, &ptName, 1, LOCALE_USER_DEFAULT, &dispID);
if(FAILED(hr))
{
buf.Format(_T("IDispatch::GetIDsOfNames(\"%s\") failed w/err 0x%08lx"), szName, hr);
MessageBox(NULL, buf, _T("AutoWrap()"), 0x10010);
_exit(0);

va_end(marker);

return hr;
}

// Allocate memory for arguments...
COleVariant *pArgs = new COleVariant[cArgs+1];
// Extract arguments...
for(int i=0; i {
pArgs[i] = va_arg(marker, COleVariant);
}

// Build DISPPARAMS
dp.cArgs = cArgs;
dp.rgvarg = pArgs;

// Handle special-case for property-puts!
if(autoType & DISPATCH_PROPERTYPUT) {
dp.cNamedArgs = 1;
dp.rgdispidNamedArgs = &dispidNamed;
}


// Make the call!
hr = pDisp->Invoke(dispID, IID_NULL, LOCALE_SYSTEM_DEFAULT, autoType, &dp, pvResult, NULL, NULL);
if(FAILED(hr)) {

buf.Format(_T("IDispatch::Invoke(\"%s\"=%08lx) failed w/err 0x%08lx"), szName, dispID, hr);
TRACE(NULL, buf, _T("AutoWrap()"), 0x10010);
return hr;
}
// End variable-argument section...
va_end(marker);

delete [] pArgs;

return hr;
}