实现接口IDispatch所遇到一个问题?

通过COM来连接数据库Access

#include <windows.h>
 #include <stdio.h>
 
void PlayWithAccess(IUnknown *p);
void CallOpenDatabase(IDispatch *d);
int main(int argc, char* argv[])
{
 
   HRESULT hRet;
   CLSID clsid;
   IUnknown *p=NULL;
   hRet=CoInitialize(NULL);
	
   if(FAILED(hRet)) {
	   printf("It Failed...\n");  
       return 1;
   }
   hRet=CLSIDFromProgID(L"Access.Application",&clsid);
 
   if(FAILED(hRet)){
	   printf("CLSID Illegal...\n");  
	   CoUninitialize(); 
	   return 1; 
   }
 
  hRet=CoCreateInstance(&clsid, NULL, CLSCTX_ALL, &IID_IUnknown, (IUnknown **)&p);
  if(FAILED(hRet)) { 
	  printf("Create Failed...."); 
	  CoUninitialize();  
	  return 2;
  }
   PlayWithAccess(p);  //////// Play with Access Application Com Object
   p->lpVtbl->Release(p);
   CoUninitialize();
   return 0;
} 
 void PlayWithAccess(IUnknown *p)
	{
	char buf[100];  
	IDispatch *d=NULL; 
	HRESULT hret;
	hret=p->lpVtbl->QueryInterface(p,&IID_IDispatch,(void **)&d);
	if(FAILED(hret)){
		printf("DispatchID Failed...\n");  
	    sprintf(buf,"DispatchID failed w/err 0x%08lx", hret);
        MessageBox(NULL, buf, "DispatchID", 0x10010);
	 return; 
	}

	printf("Got the IDispatch Interface from Object...\n");
    CallOpenDatabase(d);  
	printf("Enter Return:"); 
	gets(buf);
    d->lpVtbl->Release(d);// Release Reference
 
	}

 void CallOpenDatabase(IDispatch *d)  // Call Open database through IDispatch Interface
	{	// Late IDispatch Binding....
	 VARIANTARG args[2];  
	 
	BSTR DBLocation=SysAllocString(L"D:/project/C/c_ado/connDB02/Example.mdb"); 
	OLECHAR *MethodName=L"OpenCurrentDatabase";   // Got The Method Name from Type Library
	DISPID dispid=0;   
	HRESULT hret;
    DISPPARAMS params; 
	DISPID ids[2]={1,0};
	hret=d->lpVtbl->GetIDsOfNames(d,&IID_NULL,&MethodName,1,LOCALE_USER_DEFAULT,&dispid);

	printf("Got a Dispatch Identifier....%x\n",dispid);
    memset(args,0,sizeof(args));   // Build Up arguments
	
	args[0].vt=VT_BOOL;   // Last Argument is Optional
	args[0].boolVal=FALSE;
	args[1].vt=VT_BSTR;		// First argument is DB Location
	args[1].bstrVal=DBLocation;
    memset(&params,0,sizeof(params));
  	params.cArgs=2;  
    params.rgvarg=args; 	

	hret=d->lpVtbl->Invoke(d,dispid,&IID_NULL,LOCALE_USER_DEFAULT,DISPATCH_METHOD,&params,NULL,NULL,NULL);
	if(FAILED(hret)) {
		printf("Invoke Failed....\n"); 
	}
	SysFreeString(DBLocation);
	}

想实现IDispatch接口,结果发现不能.问题一直没有解决......

posted on 2011-06-28 14:11  光速  阅读(331)  评论(0编辑  收藏  举报

导航