A
AG
Hi all,
I am trying to automate an Excel sheet from a Windows Froms
application. In a first step, I would like to be able to read/write in
cells. I know it has been done millions of times, I have read a lot of
things in newsgroups, and in msdn, but I am stuck here. GetIDsOfName
always return -1. I don't know what name I should give it ? Would help
me to go further ?
Thank you in advance,
AG.
IRunningObjectTable * prot;
IEnumMoniker * penumMoniker=NULL;
IUnknown * punkObject;
IMoniker * mon;
ULONG Fetched=0;
HRESULT hr;
if(GetRunningObjectTable(0,&prot)!=S_OK)
{
toolStripStatusLabel1->Text = "Error, could not get a pointer
on ROT";
return;
}
toolStripStatusLabel1->Text = "ROT OK";
if(prot->EnumRunning(&penumMoniker)!=S_OK)
{
toolStripStatusLabel1->Text = "Error, could not Enumerate
through the ROT";
return;
}
penumMoniker->Reset();
while(penumMoniker->Next(1,&mon,&Fetched)==S_OK)
{
IBindCtx * pCtx;
if(CreateBindCtx(0,&pCtx)!=S_OK)
{
toolStripStatusLabel1->Text = "Error, Could not Bind
Ctx";
return;
}
LPOLESTR Name;
for(int i=0;i<Fetched;i++)
{
// here the Name variable shows the path to my excel
sheet : "file://C:\test\testExcel.xls"
if(mon.GetDisplayName(pCtx,NULL,&Name)!=S_OK)
{
toolStripStatusLabel1->Text = "Error in
GetDisplayName";
}
}
pCtx->Release();
hr = prot->GetObject(&mon[0],&punkObject);
if(!FAILED(hr))
{
hr = prot->IsRunning(&mon[0]);
if(!FAILED(hr))
{
break;
}
}
}
IDispatch * pDisp;
hr = punkObject->QueryInterface(IID_IDispatch,(void**)&pDisp);
if(FAILED(hr))
{
toolStripStatusLabel1->Text = "Error querying the Interface";
}
DISPID id;
LPOLESTR Name=L"Excel";
hr = pDisp->GetIDsOfNames(IID_NULL,&Name,1,LOCALE_USER_DEFAULT,&id);
if(FAILED(hr))
{
// I always get here. I am not sure the Name "Excel" is
correct or what to put here ? "Excel.Application" ,...?
toolStripStatusLabel1->Text = "GetIDsOfNames failed";
}
pDisp->Invoke(...)
I am trying to automate an Excel sheet from a Windows Froms
application. In a first step, I would like to be able to read/write in
cells. I know it has been done millions of times, I have read a lot of
things in newsgroups, and in msdn, but I am stuck here. GetIDsOfName
always return -1. I don't know what name I should give it ? Would help
me to go further ?
Thank you in advance,
AG.
IRunningObjectTable * prot;
IEnumMoniker * penumMoniker=NULL;
IUnknown * punkObject;
IMoniker * mon;
ULONG Fetched=0;
HRESULT hr;
if(GetRunningObjectTable(0,&prot)!=S_OK)
{
toolStripStatusLabel1->Text = "Error, could not get a pointer
on ROT";
return;
}
toolStripStatusLabel1->Text = "ROT OK";
if(prot->EnumRunning(&penumMoniker)!=S_OK)
{
toolStripStatusLabel1->Text = "Error, could not Enumerate
through the ROT";
return;
}
penumMoniker->Reset();
while(penumMoniker->Next(1,&mon,&Fetched)==S_OK)
{
IBindCtx * pCtx;
if(CreateBindCtx(0,&pCtx)!=S_OK)
{
toolStripStatusLabel1->Text = "Error, Could not Bind
Ctx";
return;
}
LPOLESTR Name;
for(int i=0;i<Fetched;i++)
{
// here the Name variable shows the path to my excel
sheet : "file://C:\test\testExcel.xls"
if(mon.GetDisplayName(pCtx,NULL,&Name)!=S_OK)
{
toolStripStatusLabel1->Text = "Error in
GetDisplayName";
}
}
pCtx->Release();
hr = prot->GetObject(&mon[0],&punkObject);
if(!FAILED(hr))
{
hr = prot->IsRunning(&mon[0]);
if(!FAILED(hr))
{
break;
}
}
}
IDispatch * pDisp;
hr = punkObject->QueryInterface(IID_IDispatch,(void**)&pDisp);
if(FAILED(hr))
{
toolStripStatusLabel1->Text = "Error querying the Interface";
}
DISPID id;
LPOLESTR Name=L"Excel";
hr = pDisp->GetIDsOfNames(IID_NULL,&Name,1,LOCALE_USER_DEFAULT,&id);
if(FAILED(hr))
{
// I always get here. I am not sure the Name "Excel" is
correct or what to put here ? "Excel.Application" ,...?
toolStripStatusLabel1->Text = "GetIDsOfNames failed";
}
pDisp->Invoke(...)