예제 #1
0
파일: connect.cpp 프로젝트: cran/excel.link
SEXP
R_connect(SEXP className, SEXP raiseError)
{
  IUnknown *unknown = NULL;
  HRESULT hr;
  SEXP ans = R_NilValue;
  CLSID classId;

  if(R_getCLSIDFromString(className, &classId) == S_OK) {
    hr = GetActiveObject(classId, NULL, &unknown);
    if(SUCCEEDED(hr)) {
      void *ptr;
      hr = unknown->QueryInterface(IID_IDispatch, &ptr);
      ans = R_createRCOMUnknownObject((void *) ptr, "COMIDispatch");
    } else {
      if(LOGICAL(raiseError)[0]) {
	/* From COMError.cpp  - COMError */
	TCHAR buf[512];
	GetScodeString(hr, buf, sizeof(buf)/sizeof(buf[0]));
	PROTECT(ans = mkString(buf));
	SET_CLASS(ans, mkString("COMErrorString"));
	UNPROTECT(1);
        return(ans);
      } else
	return(R_NilValue);
    }
  } else {
      PROBLEM "Couldn't get clsid from the string"
	WARN;
  }
  return(ans);
}
예제 #2
0
IAtmoLiveViewControl *getAtmoLiveViewControl() {
    IUnknown              *pIUnknown = NULL;
    IAtmoLiveViewControl  *pAtmoLiveViewControl = NULL;
    GetActiveObject(CLSID_AtmoRemoteControl,NULL,&pIUnknown);
    if(pIUnknown != NULL) {
       pIUnknown->QueryInterface(IID_IAtmoLiveViewControl,(void **)&pAtmoLiveViewControl);  
    }
    return pAtmoLiveViewControl;
}
예제 #3
0
IAtmoRemoteControl2 *getAtmoRemoteControl2() {
    IUnknown             *pIUnknown = NULL;
    IAtmoRemoteControl2   *pAtmoRemoteControl2 = NULL;
    GetActiveObject(CLSID_AtmoRemoteControl,NULL,&pIUnknown);
    if(pIUnknown != NULL) {
       pIUnknown->QueryInterface(IID_IAtmoRemoteControl2,(void **)&pAtmoRemoteControl2);  
    }
    return pAtmoRemoteControl2;
}
예제 #4
0
error_status_t nvdaInProcUtils_getActiveObject(handle_t bindingHandle, const wchar_t* progid, IUnknown** ppUnknown) {
	if(!progid) {
		LOG_DEBUGWARNING(L"NULL progid");
		return E_FAIL;
	}
	IID clsid;
	HRESULT res=CLSIDFromString(progid,&clsid);
	if(res!=NOERROR) {
		LOG_DEBUGWARNING(L"CLSIDFromString for "<<progid<<L" returned "<<res);
		return res;
	}
	return GetActiveObject(clsid,NULL,ppUnknown);
}
예제 #5
0
//------------------------------------------------------------------------------
// Method: OpenExtend
//
// Description: Finds the Extend application if it is running.  If it is not
//		running, this code will open the application and then get a reference
//		to it. 
//
// Parameters:
//		openLibraries: if true will also open libraries usually required
//                     by SEI models
//
// Return:
//		true			no errors occured
//		false			error occured
//
//------------------------------------------------------------------------------
bool ExtendBridge::OpenExtend(bool openLibraries) {
	LPUNKNOWN	m_pUnknown = NULL;
	CLSID 		clsid;

	CLSIDFromString (EXTEND_CLSID_STRING, &clsid);

	// try to create an instance of the Extend object
	HRESULT hResult = GetActiveObject(clsid, NULL, (IUnknown **) &m_pUnknown);

	if (hResult == S_OK) {
    	// found active object, now get a pointer to its IDispatch interface
		hResult = m_pUnknown->QueryInterface(IID_IDispatch, (void **) &pExtendDisp);
		hResult = m_pUnknown->Release();
		printf("        Extend already open.\n");
    } else {
    	// unable to find active object, open Extend and get IDisplatch pointer
		printf("        Extend not open, opening Extend....\n");

		hResult = CoCreateInstance (
			clsid, 						// class ID of object
			NULL,						// controlling IUnkown
			CLSCTX_LOCAL_SERVER,		// context
			IID_IDispatch,				// interface wanted
			(LPVOID *) &pExtendDisp) ;	// output variable

		if (hResult != NOERROR) {
    		// error - unable to open Extend
			printf("        ERROR: Unable to open Extend.\n\n");
			return(false);
        } else {
			printf("        Extend opened.\n");
            // NOTE: When we run Extend v6, it always start with a blank model 
            // named Model-1.mox. (Extend v5 didn't have this feature)
		}
	}

    if (openLibraries) {
    	// open the extend libraries
        bool result = openStdLibraries();
        if (!result) {
		    printf("        ERROR: Unable to open Extend libraries.\n\n");
        } else {
		    printf("        Extend libraries opened.\n");
        }
        return (result);
    }

	return true;
}
예제 #6
0
BOOL CDriverDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// create the calculator object that we'll drive through OLE automation
	COleException e;
	CLSID clsid;
	if (CLSIDFromProgID(OLESTR("mfccalc.calculator"), &clsid) != NOERROR)
	{
		AfxMessageBox(IDP_UNABLE_TO_CREATE);
		EndDialog(IDABORT);
		return FALSE;
	}

	// try to get the active calculator before creating a new one
	LPUNKNOWN lpUnk;
	LPDISPATCH lpDispatch;
	if (GetActiveObject(clsid, NULL, &lpUnk) == NOERROR)
	{
		HRESULT hr = lpUnk->QueryInterface(IID_IDispatch,
			(LPVOID*)&lpDispatch);
		lpUnk->Release();
		if (hr == NOERROR)
			m_calc.AttachDispatch(lpDispatch, TRUE);
	}

	// if not dispatch ptr attached yet, need to create one
	if (m_calc.m_lpDispatch == NULL &&
		!m_calc.CreateDispatch(clsid, &e))
	{
		AfxMessageBox(IDP_UNABLE_TO_CREATE);
		EndDialog(IDABORT);
		return FALSE;
	}

	// attempt to make it visible
	m_calc.SetVisible(TRUE);
	if (!m_calc.GetVisible())
	{
		AfxMessageBox(IDP_UNABLE_TO_SHOW);
		EndDialog(IDABORT);
		return FALSE;
	}

	// refresh display to contents of the automation calculator
	OnRefresh();

	return TRUE;  // return TRUE  unless you set the focus to a control
}
예제 #7
0
// Get a dispatch pointer from the current object associated
// with a ProgID
bool wxAutomationObject::GetInstance(const wxString& progId, int flags) const
{
    if (m_dispatchPtr)
        return false;

    CLSID clsId;
    HRESULT hr = wxCLSIDFromProgID(progId, clsId);
    if (FAILED(hr))
        return false;

    IUnknown *pUnk = NULL;
    hr = GetActiveObject(clsId, NULL, &pUnk);
    if (FAILED(hr))
    {
        if ( flags & wxAutomationInstance_CreateIfNeeded )
        {
            const_cast<wxAutomationObject *>(this)->
                m_dispatchPtr = DoCreateInstance(progId, clsId);
            if ( m_dispatchPtr )
                return true;
        }
        else
        {
            // Log an error except if we're supposed to fail silently when the
            // error is that no current instance exists.
            if ( hr != MK_E_UNAVAILABLE ||
                    !(flags & wxAutomationInstance_SilentIfNone) )
            {
                wxLogSysError(hr,
                              _("Cannot get an active instance of \"%s\""),
                              progId);
            }
        }

        return false;
    }

    hr = pUnk->QueryInterface(IID_IDispatch, (LPVOID*) &m_dispatchPtr);
    if (FAILED(hr))
    {
        wxLogSysError(hr,
                      _("Failed to get OLE automation interface for \"%s\""),
                      progId);
        return false;
    }

    return true;
}
예제 #8
0
HRESULT dhGetObjectEx(LPCOLESTR szPathName, LPCOLESTR szProgId, REFIID riid,
		         DWORD dwClsContext, LPVOID lpvReserved, void ** ppv)
{
	HRESULT hr;

	DH_ENTER(L"GetObjectEx");

	if ((!szProgId && !szPathName) || !riid || !ppv || lpvReserved) return DH_EXIT(E_INVALIDARG, szProgId);

	if (szPathName)
	{

		if (!szProgId)
		{
			hr = CoGetObject(szPathName, NULL, riid, ppv);
		}
		else
		{
			IPersistFile * ppf = NULL;

			hr = dhCreateObjectEx(szProgId, &IID_IPersistFile, dwClsContext, NULL, (void **) &ppf);

			if (SUCCEEDED(hr)) hr = ppf->lpVtbl->Load(ppf, szPathName, 0);
			if (SUCCEEDED(hr)) hr = ppf->lpVtbl->QueryInterface(ppf, riid, ppv);

			if (ppf) ppf->lpVtbl->Release(ppf);
		}
	}
	else
	{

		CLSID clsid;
		IUnknown * pUnk = NULL;

		if (L'{' == szProgId[0])
			hr = CLSIDFromString((LPOLESTR) szProgId, &clsid);
		else
			hr = CLSIDFromProgID(szProgId, &clsid);

		if (SUCCEEDED(hr)) hr = GetActiveObject(&clsid, NULL, &pUnk);
		if (SUCCEEDED(hr)) hr = pUnk->lpVtbl->QueryInterface(pUnk, riid, ppv);

		if (pUnk) pUnk->lpVtbl->Release(pUnk);
	}

	return DH_EXIT(hr, szProgId);
}
예제 #9
0
//Retrieves a reference to a COM object from an existing process
HRESULT 
Player::ObjGet(REFCLSID rclsid, REFIID riid, void** pDispatch)
{
	//based on c++ example http://support.microsoft.com/kb/238610
	HRESULT hr;
	IUnknown	*pUnk  = NULL;

	for(int i=1;i<=5;i++) { //try attaching for up to 5 attempts
		hr = GetActiveObject(rclsid, NULL, (IUnknown**)&pUnk);
		if(SUCCEEDED(hr)) {
			hr = pUnk->QueryInterface(riid, pDispatch);
			break;
		}
		::Sleep(200);
	}
	//Release the no-longer-needed IUnknown...
	RELEASE(pUnk, TRUE);

	return hr;
}
예제 #10
0
파일: Reference.cpp 프로젝트: jbroll/tcom
Reference *
Reference::getActiveObject (REFCLSID clsid, const Interface *pInterface)
{
    HRESULT hr;

    // Retrieve the instance of the object.
    IUnknownPtr pActive;
    hr = GetActiveObject(clsid, NULL, &pActive);
    if (FAILED(hr)) {
        _com_issue_error(hr);
    }

    // If we know it's a custom interface, then query for an interface pointer
    // to that interface, otherwise query for an IUnknown interface.
    IUnknown *pUnknown;
    hr = pActive->QueryInterface(
        (pInterface == 0) ? IID_IUnknown : pInterface->iid(),
        reinterpret_cast<void **>(&pUnknown));
    if (FAILED(hr)) {
        _com_issue_error(hr);
    }

    if (pInterface == 0) {
        pInterface = findInterface(pUnknown, clsid);
        if (pInterface != 0) {
            // Get a pointer to the derived interface.
            IUnknown *pNew;
            hr = pUnknown->QueryInterface(
                pInterface->iid(),
                reinterpret_cast<void **>(&pNew));
            if (SUCCEEDED(hr)) {
                pUnknown->Release();
                pUnknown = pNew;
            }
        }
    }

    return new Reference(pUnknown, pInterface, clsid);
}
예제 #11
0
HRESULT JNICALL GetRunningActiveObject
  (JNIEnv * env, jclass clazz, jstring clsid, IDispatch ** ppDisp)
{
   // jstring to char
   const char * utfChars = env->GetStringUTFChars( clsid, NULL );
   UBSTR lpsz(utfChars);
   env->ReleaseStringUTFChars(clsid, utfChars);

   // wchar_t to CLSID
   GUID guid;
   HRESULT hr = CLSIDFromString( lpsz, &guid );
   if ( FAILED( hr ) ) {
      //ThrowComException( env, hr, "CLSIDFromString(...) FAILED!" );
      //return hr;

      //WINOLEAPI CLSIDFromProgID (IN LPCOLESTR lpszProgID, OUT LPCLSID lpclsid);
      hr = CLSIDFromProgID( lpsz, &guid );
      if ( FAILED( hr ) ) {
         ThrowComException( env, hr, "CLSIDFromString/CLSIDFromProgID(...) FAILED!" );
         return hr;
      }

   }

   IUnknown * pItf = 0;
   hr = GetActiveObject( guid, 0, &pItf );
   if ( FAILED( hr ) ) {
      return hr;
   }

   //*ppDisp = 0;
   hr = pItf->QueryInterface(IID_IDispatch, (void**)ppDisp);
   pItf->Release();

   return hr;

}
예제 #12
0
파일: com4j.cpp 프로젝트: Alcar32/com4j
JNIEXPORT jlong JNICALL Java_com4j_Native_getObject(
	JNIEnv* env, jclass __unused__, jstring _fileName, jstring _progId) {

	HRESULT hr;

	if(_progId==NULL) {
		// case 1: just file name
		IBindCtxPtr pbc;
		ULONG cEaten;
		IMonikerPtr pmk;
		IDispatch* pDisp;

		hr = CreateBindCtx(NULL,&pbc);
		if(FAILED(hr)) {
			error(env,__FILE__,__LINE__,hr,"Failed to CreateBindCtx");
			return 0;
		}
		hr = MkParseDisplayName(pbc,JString(env,_fileName),&cEaten,&pmk);
		if(FAILED(hr)) {
			error(env,__FILE__,__LINE__,hr,"Failed to MkParseDisplayName");
			return 0;
		}
		hr = BindMoniker(pmk,0,__uuidof(IDispatch),(LPVOID*)&pDisp);
		if(FAILED(hr)) {
			error(env,__FILE__,__LINE__,hr,"Failed to bind moniker");
			return 0;
		}

		return reinterpret_cast<jlong>(pDisp);
	}

	JString progId(env,_progId);
	CLSID clsid;
	IUnknown* pUnk=NULL;

	hr = CLSIDFromProgID(progId,&clsid);
	if(FAILED(hr)) {
		error(env,__FILE__,__LINE__,hr,"Unrecognized progID");
		return 0;
	}

	if(_fileName==NULL) {
		// case 2: just progId
		hr = GetActiveObject(clsid,NULL,&pUnk);
		if(FAILED(hr)) {
			error(env,__FILE__,__LINE__,hr,"Failed to GetActiveObject");
			return 0;
		}
		return reinterpret_cast<jlong>(pUnk);
	}

	// case 3: both file name and progID
	hr = CoCreateInstance(clsid,NULL,CLSCTX_SERVER,__uuidof(IUnknown),(LPVOID*)&pUnk);
	if(FAILED(hr)) {
		error(env,__FILE__,__LINE__,hr,"Failed to create CoCreateInstance");
		return 0;
	}

	IPersistFilePtr ppf(pUnk);
	hr = ppf->Load(JString(env,_fileName),0);
	if(FAILED(hr)) {
		error(env,__FILE__,__LINE__,hr,"Failed to load from file");
		pUnk->Release();
		return 0;
	}

	return reinterpret_cast<jlong>(pUnk);
}
void CXunJianDlg::OnOK() 
{
	try{
	pList= (CListBox *)GetDlgItem(IDC_HOSTLIST);
	/*if( pList->GetTextLen(0)>15 || pList->GetTextLen(0)<7 )
	{
		MessageBox("主机列表文件未加载,请重新选择!");
		return;
	}*/

	_GUID clsid;
	IUnknown *pUnk;
	IDispatch *pDisp;
	LPDISPATCH lpDisp;

	_Application app;
	Workbooks xj_books;
	_Workbook xj_book;
	Worksheets xj_sheets;
	_Worksheet xj_sheet;
	Range range;
	Range unionRange;
	Range cols;

	Font font;
//	COleVariant background;

	COleVariant covOptional((long)DISP_E_PARAMNOTFOUND, VT_ERROR);

	::CLSIDFromProgID(L"Excel.Application",&clsid); // from registry
	if(GetActiveObject(clsid, NULL,&pUnk) == S_OK)
	{
		VERIFY(pUnk->QueryInterface(IID_IDispatch,(void**) &pDisp) == S_OK);
		app.AttachDispatch(pDisp);
		pUnk->Release();
	} 
	else
	{  
		if(!app.CreateDispatch("Excel.Application"))
		{
			MessageBox("Excel program not found");     
			app.Quit();     
			return;
		}
	}

	xj_books=app.GetWorkbooks();
	xj_book=   xj_books.Add(covOptional);
	xj_sheets= xj_book.GetSheets();
	xj_sheet=  xj_sheets.GetItem(COleVariant((short)1));

	int i;
	Range item;
	range=xj_sheet.GetRange(COleVariant("A1"),COleVariant("F1"));
	for(i= 0; i < 6; i++)
	{
		item.AttachDispatch(range.GetItem(COleVariant((long)1),COleVariant((long)i+1)).pdispVal);
		item.SetValue2(COleVariant(PROJ[i]));
	}  //描绘第一行目录

	//range=xj_sheet.GetRange(COleVariant("A1"),COleVariant("F1"));
	lpDisp=range.GetInterior();
	Interior   cellinterior;
	cellinterior.AttachDispatch(lpDisp);
	cellinterior.SetColor(COleVariant((long)0xc0c0c0));  //设置背景色为灰色
	cellinterior.ReleaseDispatch();
	//range=xj_sheet.GetRange(COleVariant("A1"),COleVariant("F1"));
	range.SetHorizontalAlignment(COleVariant((long)-4108)); //全部居中
	Borders bord;
	bord=range.GetBorders();
	bord.SetLineStyle(COleVariant((short)1));  //设置边框
	//range=xj_sheet.GetRange(COleVariant("A1"),COleVariant("F1"));
	cols=range.GetEntireColumn();
	cols.AutoFit();  //自动调整

/**************************表格初始绘画完成************************************/

	long usedRowNum; //行计数
	CString handleFile;
	CString hostFileName,hostip;
	bool error = false;
	CString infos,info;
	ExcelFile excelFile;
	ReadTxt xj_txt;
	xj_HostCount=pList->GetCount();
	for(int n_host=0;n_host<xj_HostCount;n_host++)  //主循环,一个文件一次循环。
	{		
		pList->GetText(n_host,hostFileName);
		hostip = hostFileName;
		handleFile = hostFileName + _T(" 正在处理...");
		pList->DeleteString(n_host);
		pList->InsertString(n_host,handleFile);
		pList->SetCurSel(n_host);
		pList->UpdateWindow();

		hostFileName = xj_FilePath + hostFileName;
		hostFileName += _T(".txt");
		CStdioFile hostFile;
		if(!hostFile.Open(hostFileName,CFile::modeRead,0))
		{  //记录不存在文件名
			handleFile.Replace("正在处理...","失败!");
			error = true;
			pList->DeleteString(n_host);
			pList->InsertString(n_host,handleFile);
			pList->UpdateWindow();
			continue;
		}
		usedRowNum = excelFile.GetRowCount(xj_sheet);
		range.AttachDispatch(xj_sheet.GetCells());

		//info.Format( _T("%d"), n_host+1);
		info = xj_txt.ReadHostName(&hostFile,COMMAND[0],COMMAND[1]);  //获取节点名称
		range.SetItem(COleVariant(usedRowNum+1),COleVariant(long(1)),COleVariant(info));

		int portCount = 0;   //端口数目,不包括7/1
		CString nSend, nRecv;
		float n_Send,n_Recv;

		while(hostFile.ReadString(info))
			if(info.Find( COMMAND[4]) > -1) break;
		while( hostFile.ReadString(info) && info.Find( "[local]" ) == -1 )  //端口号和流量
		{
			if( info.Find( "/" ) == -1 || info.Find( "7/1" ) > -1 ) continue;

			info.Replace( "ethernet","");
			info = _T("'") + info;
			infos = info;

			while( hostFile.ReadString(info) )
				if( info.Find( "send bit rate" ) > -1 ) break;
			nSend = info.Mid( 60 );
			hostFile.ReadString(info);
			nRecv = info.Mid( 60 );
			nSend.Trim();
			nRecv.Trim();
			n_Send = (float)atof(nSend);
			n_Recv = (float)atof(nRecv);

			if( n_Send < 1000 && n_Recv < 1000 ) continue;
			portCount++;
			range.SetItem(COleVariant(usedRowNum+portCount),COleVariant(long(2)),COleVariant(infos.Trim()));
			range.SetItem(COleVariant(usedRowNum+portCount),COleVariant(long(4)),COleVariant((n_Send>n_Recv)?nSend:nRecv));
		}

		hostFile.SeekToBegin();
		infos = xj_txt.ReadLine(&hostFile,"ubscriber Address");  //历史在线最大用户数
		if( infos == _T("") ) info = _T("0");
		else
		{
			int token = 0;
			for(i = 0; i < 5 ; i++) info = infos.Tokenize(" ",token);
		}
		range.SetItem(COleVariant(usedRowNum+1),COleVariant(long(6)),COleVariant(info.Trim()));  

		hostFile.Close();

		if(portCount > 1)
		{
			unionRange.AttachDispatch(range.GetItem(COleVariant(usedRowNum+1),COleVariant((long)1)).pdispVal);
			unionRange.AttachDispatch(unionRange.GetResize(COleVariant((long)portCount),COleVariant((long)1)));
			unionRange.Merge(COleVariant((long)0));  //节点名称单元格合并

			unionRange.AttachDispatch(range.GetItem(COleVariant(usedRowNum+1),COleVariant((long)6)).pdispVal);
			unionRange.AttachDispatch(unionRange.GetResize(COleVariant((long)portCount),COleVariant((long)1)));
			unionRange.Merge(COleVariant((long)0)); 			
			//历史最大用户数合并
		}

		unionRange.AttachDispatch(range.GetItem(COleVariant(usedRowNum+1),COleVariant((long)1)).pdispVal);
		unionRange.AttachDispatch(unionRange.GetResize(COleVariant((long)portCount),COleVariant((long)6)));
		unionRange.SetRowHeight(COleVariant(13.5));
		bord = unionRange.GetBorders();
		bord.SetLineStyle(COleVariant((short)1));  //设置边框



		handleFile.Replace("正在处理...","已完成");
		pList->DeleteString(n_host);
		pList->InsertString(n_host,handleFile);
		pList->UpdateWindow();
	}

	CTime time;
	time = time.GetCurrentTime();
	infos = time.Format("%Y%m%d%H%M%S");  //time.Format();
	info = _T("巡检报表") + infos + _T(".xlsx");
	info = xj_FilePath + info;
	info.Replace("\\\\","\\");

	xj_book.SaveAs(COleVariant(info),covOptional,covOptional,covOptional,covOptional,covOptional,0,covOptional,covOptional,covOptional,covOptional,covOptional);
	
	if(error == true )
	{
		MessageBox("巡检报表已完成,已保存到\r\n" + info + "\r\n有文件打开错误,点击\"确定\"返回查看","有文件打开错误!",MB_OK|MB_ICONWARNING);
		app.Quit();
	}
	else 
	{
		if(MessageBox("巡检报表已完成,已保存到\r\n" + info + "\r\n点击\"确定\"打开文件查看","生成报表完成",MB_OKCANCEL) == IDOK)
		{
			app.SetVisible(TRUE);
			app.SetUserControl(TRUE);
		}
		else app.Quit();
	}
}
catch (CFileException* e)
    {
        e->ReportError();
        e->Delete();
    }
	//CDialog::OnOK();
}
/*!
 @brief このメソッドは WM_INITDIALOG のメッセージに応答して呼び出されます。
*/
BOOL CInspectUsefulToolsDlg::OnInitDialog()
{
	CDialog::OnInitDialog();

	// このダイアログのアイコンを設定します。アプリケーションのメイン ウィンドウがダイアログでない場合、
	//  Framework は、この設定を自動的に行います。
	SetIcon(m_hIcon, TRUE);			// 大きいアイコンの設定
	//SetIcon(m_hIcon, FALSE);		// 小さいアイコンの設定

	// メニューの初期化
	InitializeMenuTree();
	InitializeContents();

	// タイトルの設定
	CString strAppName = CString((LPCTSTR)IDS_APP_NAME);
	this->SetWindowText(strAppName);

	CLSID clsid;
	if (CLSIDFromProgID(OLESTR("Excel.Application"), &clsid) == NOERROR){
		// Excel がインストールされている
		LPUNKNOWN lpUnk;
		HRESULT hr;
		LPDISPATCH lpDispatch;
		BOOL bOpenExcel = FALSE;
		if (GetActiveObject(clsid, NULL, &lpUnk) == NOERROR){
			hr = lpUnk->QueryInterface(IID_IDispatch, (LPVOID*)&lpDispatch);
			lpUnk->Release();
			if (hr == NOERROR) {
				//すでにExcelが起動されている状態であればAttachDispatch
				m_inXLApp.AttachDispatch(lpDispatch,TRUE);
				bOpenExcel = TRUE;
			}
		}

		if (m_inXLApp.m_lpDispatch == NULL) {
			bOpenExcel = m_inXLApp.CreateDispatch(clsid);
			m_bOpenXL = TRUE;
		}

		if (bOpenExcel == TRUE) {
			// Excelファイルの初期化
			CWorkbooks inWorkbooks = m_inXLApp.get_Workbooks();
			COleVariant varNull;
			varNull.ChangeType(VT_NULL);

			HRSRC hrSrc = FindResource(AfxGetApp()->m_hInstance, MAKEINTRESOURCE(IDR_MACRO_EXCEL_RCDATA), RT_RCDATA);
			if (hrSrc != NULL) {
				HGLOBAL hGlobal = LoadResource(AfxGetApp()->m_hInstance, hrSrc);

				if (hGlobal != NULL) {
					char *rcData = (char *)LockResource(hGlobal);

					/* リソースサイズの取得 */
					DWORD dwSize = SizeofResource(AfxGetApp()->m_hInstance, hrSrc);

					TCHAR szFilePath[MAX_PATH];
					GetTempPath(MAX_PATH, szFilePath);
					TCHAR szFileName[MAX_PATH];
					GetTempFileName(szFilePath, _T("SubTools_"), 0, szFileName);

					CFile inFile;
					inFile.Open(szFileName, CFile::modeWrite);
					inFile.Write(rcData, dwSize);
					inFile.Close();
					strTempFilePath = szFileName;

					m_inXLBook = inWorkbooks.Open(szFileName
						, varNull, varNull, varNull, varNull, varNull, varNull, varNull, varNull, varNull, varNull, varNull, varNull,varNull, varNull);
					m_bOpenBook = TRUE;
				}
			}
		}
	}

	return TRUE;
}
예제 #15
0
HRESULT primGetActiveObject( CLSID* clsid, IUnknown** unk )
{
  if (!unk) return E_POINTER;
       else *unk = NULL;
  return GetActiveObject( clsid, NULL, unk );
}
예제 #16
0
파일: oletest.c 프로젝트: debrouxl/tiemu
int main(void)
{
  IUnknown *iunk;
  ITiEmuOLE *tiemuOLE;
  VARIANT_BOOL ready;
  BSTR command;

  fprintf(stdout, "Initializing OLE...\n");
  if (OleInitialize(0) != S_OK) {puts("OLE error. (#1)");return 1;}

  fprintf(stdout, "Getting object...");
  if (GetActiveObject(&CLSID_TiEmuOLE,NULL,&iunk) != S_OK || !iunk) 
  {
    // TiEmu not running
    // Figure out the path of TiEmu and run it
    char buffer[2049];
    HKEY hKey;
    DWORD type, size=2048;

    if (RegOpenKeyEx(HKEY_CLASSES_ROOT,"CLSID\\{B2A17B13-9D6F-4DD4-A2A9-6FE06ADC1D33}\\LocalServer32",0, KEY_QUERY_VALUE,&hKey))
      {OleUninitialize();puts("OLE error (#2).");return 2;}

    if (RegQueryValueEx(hKey,NULL,NULL,&type,buffer,&size) || type != REG_SZ)
      {RegCloseKey(hKey);OleUninitialize();puts("OLE error (#3).");return 3;}
    buffer[2048]=0;

    if (RegCloseKey(hKey))
      {OleUninitialize();puts("OLE error (#4).");return 4;}

    if ((int)ShellExecute(NULL,NULL,buffer,NULL,NULL,SW_SHOW)<=32)
      {OleUninitialize();puts("OLE error (#5).");return 5;}

    while (GetActiveObject(&CLSID_TiEmuOLE,NULL,&iunk) != S_OK || !iunk); // Wait for the object
  }
  fprintf(stdout, "Done !\n");

  fprintf(stdout, "Querying interface...\n");
  if (iunk->lpVtbl->QueryInterface(iunk,&IID_ITiEmuOLE,(void**)&tiemuOLE) != S_OK || !tiemuOLE)
    {OleUninitialize();puts("OLE error (#6).");return 6;}

  fprintf(stdout, "Waiting for ready... ");
  do 
  {
    if (tiemuOLE->lpVtbl->ready_for_transfers(tiemuOLE,&ready) != S_OK)
      {tiemuOLE->lpVtbl->Release(tiemuOLE);OleUninitialize();puts("OLE error (#7).");return 7;}
  } while (!ready);
  Sleep(10000); // give the emulated calculator time to react
  fprintf(stdout, "Done !\n");

  fprintf(stdout, "Turning calc on... ");
  if (tiemuOLE->lpVtbl->turn_calc_on(tiemuOLE,&ready) != S_OK || !ready)
    {tiemuOLE->lpVtbl->Release(tiemuOLE);OleUninitialize();puts("OLE error (#8).");return 8;}
  Sleep(3000); // give the emulated calculator time to react
  fprintf(stdout, "Done !\n");

  fprintf(stdout, "Sending command... ");
    command=SysAllocString(L"2+3");
  if (!command)
    {tiemuOLE->lpVtbl->Release(tiemuOLE);OleUninitialize();puts("OLE error (#9).");return 9;}

  if (tiemuOLE->lpVtbl->execute_command(tiemuOLE,command,&ready) != S_OK || !ready)
    {SysFreeString(command);tiemuOLE->lpVtbl->Release(tiemuOLE);
     OleUninitialize();puts("OLE error (#10).");return 10;}
  SysFreeString(command);
  fprintf(stdout, "Done !\n");

  fprintf(stdout, "Releasing...");
  tiemuOLE->lpVtbl->Release(tiemuOLE);
  OleUninitialize();
  fprintf(stdout, "Done !\n");

  return 0;
}