HRESULT OcxObject::RawInvoke(IRef<ITypeInfo>& typeinfo, IDispatch *dispatch, DISPID dispid, word flags, DISPPARAMS *params, VARIANT *result, EXCEPINFO *excep, unsigned *arg_err) { LOGINVOKE("IDispatch::Invoke"); if(dispid == 0) { // convert object to dispatch value if(!result) return E_INVALIDARG; result->vt = VT_DISPATCH; result->pdispVal = dispatch; if(dispatch) dispatch->AddRef(); return S_OK; } if(!typeinfo) { LOG("dispid = " << FormatIntHex(dispid) << ": typeinfo = NULL"); return E_FAIL; } #if LOG_INVOKES >= 1 BSTR names[1] = { NULL }; unsigned count = 0; typeinfo->GetNames(dispid, names, 1, &count); String name; if(names[0]) name = BSTRToString(names[0]); else name = FormatIntHex(dispid); switch(flags) { case DISPATCH_METHOD: name << " - method"; break; case DISPATCH_PROPERTYGET: name << " - propget"; break; case DISPATCH_PROPERTYPUT: name << " - propput"; break; case DISPATCH_PROPERTYPUTREF: name << " - propputref"; break; } LOG("Member name: " << name); #endif if(!typeinfo) return E_FAIL; TYPEATTR *attr; typeinfo->GetTypeAttr(&attr); LOGINVOKE("GetTypeInfo: typekind = " << (int)attr->typekind); // HRESULT res = typeinfo->Invoke(dispatch, dispid, flags, params, result, excep, arg_err); HRESULT res = DispInvoke(dispatch, ~typeinfo, dispid, flags, params, result, excep, arg_err); if(FAILED(res)) { RLOG("failure: dispid = " << (int)dispid << ", #args = " << (int)params->cArgs << ", #named args = " << (int)params->cNamedArgs << ", return " << FormatIntHex(result)); for(int i = 0; i < (int)params->cArgs; i++) { RLOG("arg[" << i << "] (vt = " << (int)params->rgvarg[i].vt << "): " << StdFormat(AsValue(params->rgvarg[i]))); } RLOG("#funcs = " << attr->cFuncs); for(int i = 0; i < attr->cFuncs; i++) { FUNCDESC *func; typeinfo->GetFuncDesc(i, &func); RLOG("memid = " << func->memid << ", cParams " << func->cParams << ", cParamsOpt = " << func->cParamsOpt << ", cScodes " << func->cScodes << ", funckind = " << (int)func->funckind << ", invkind " << (int)func->invkind << ", flags = " << FormatIntHex(func->wFuncFlags)); typeinfo->ReleaseFuncDesc(func); } } typeinfo->ReleaseTypeAttr(attr); LOGINVOKE("//IDispatch::Invoke"); return LOGRESULT(res); }
STDMETHODIMP TDocFracLibImpl::SetInString(BSTR inString) { try { DoxCore->SetInString(BSTRToString(inString)); } catch(Exception &e) { return Error(e.Message.c_str(), IID_IDocFracLib); } return S_OK; };
STDMETHODIMP TDocFracLibImpl::SetOutFormat(BSTR format) { try { DoxCore->SetOutFormat(BSTRToString(format)); } catch(Exception &e) { return Error(e.Message.c_str(), IID_IDocFracLib); } return S_OK; };
HRESULT Directory::CreateDirectory(BSTR name, IDirectory** outDir) { std::string sName = BSTRToString(name); FsBox::BlockHandle dirHandle = _containerIntf->CreateDir(_dir, sName); if (!dirHandle) { return E_FAIL; } Directory* directory = new(std::nothrow) Directory(_containerIntf, this, dirHandle); if (!directory) { _containerIntf->CloseDir(_dir); return E_OUTOFMEMORY; } *outDir = static_cast<IDirectory*>(directory); return S_OK; }
HRESULT Directory::CreateFile(BSTR name, IFile** outFile) { std::string sName = BSTRToString(name); FsBox::BlockHandle fileHandle = _containerIntf->CreateFile(_dir, sName); if (!fileHandle) { return E_FAIL; } File* file = new(std::nothrow) File(_containerIntf, this, fileHandle); if (!file) { _containerIntf->CloseFile(fileHandle); return E_OUTOFMEMORY; } *outFile = static_cast<IFile*>(file); return S_OK; }
HRESULT Directory::DeleteDirectory(BSTR name) { return _containerIntf->DeleteDir(_dir, BSTRToString(name)) ? S_OK : E_FAIL; }