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); }
IAtmoLiveViewControl *getAtmoLiveViewControl() { IUnknown *pIUnknown = NULL; IAtmoLiveViewControl *pAtmoLiveViewControl = NULL; GetActiveObject(CLSID_AtmoRemoteControl,NULL,&pIUnknown); if(pIUnknown != NULL) { pIUnknown->QueryInterface(IID_IAtmoLiveViewControl,(void **)&pAtmoLiveViewControl); } return pAtmoLiveViewControl; }
IAtmoRemoteControl2 *getAtmoRemoteControl2() { IUnknown *pIUnknown = NULL; IAtmoRemoteControl2 *pAtmoRemoteControl2 = NULL; GetActiveObject(CLSID_AtmoRemoteControl,NULL,&pIUnknown); if(pIUnknown != NULL) { pIUnknown->QueryInterface(IID_IAtmoRemoteControl2,(void **)&pAtmoRemoteControl2); } return pAtmoRemoteControl2; }
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); }
//------------------------------------------------------------------------------ // 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; }
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 }
// 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; }
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); }
//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; }
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); }
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; }
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; }
HRESULT primGetActiveObject( CLSID* clsid, IUnknown** unk ) { if (!unk) return E_POINTER; else *unk = NULL; return GetActiveObject( clsid, NULL, unk ); }
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; }