13. januar 2005 - 16:55Der er
3 kommentarer og 1 løsning
Invoke af global funktion i typelib (appobject)
Koden nedenfor forklarer det meste... Bare opret en Win32 console app. med ATL understøttelse. Det er på engelsk, da jeg også har posted det i et engelsk forum... Af en eller anden grund så fejler den altid, når jeg kalder den funktion (+nogle andre).
-Broholm
// ATLGlobal.cpp : Defines the entry point for the console application. //
/* Should do the same as the following .vbs file (which works)
int _tmain(int argc, _TCHAR* argv[]) { ::CoInitialize(NULL); { //<-- Scope to force CComPtr destructors before ::CoUninitialize() CComBSTR ProgId("Word.Application"); HRESULT hr;
//This is for demonstration purposes only - //Pardon the hardcoding of method names and values, and forgetting to invoke Quit method. //I'm also aware that not all resources is released
int _tmain(int argc, _TCHAR* argv[]) { ::CoInitialize(NULL); { //<-- Scope to force CComPtr destructors before ::CoUninitialize() CComBSTR ProgId("Word.Application"); HRESULT hr;
EXCEPINFO e; CComVariant vResult; //vResult.ChangeType(VT_R4); //<--- Even tried this :-( UINT puArgErr(0);
hr = pDisp->Invoke(dispIdClass,IID_NULL,LOCALE_USER_DEFAULT,DISPATCH_METHOD,&dpArgs,&vResult,&e,&puArgErr); //<-- FAILS with hr = E_FAIL if(FAILED(hr)) std::cout << "Invoke failed" << std::endl; //Ok that one fails - now get the appobject coclass and invoke thru that interface //Get TypeLib CComPtr<ITypeInfo> pTI; hr = pDisp->GetTypeInfo(0,LOCALE_USER_DEFAULT,&pTI); CComQIPtr<ITypeLib> pTypeLib; UINT TLindex(0); hr = pTI->GetContainingTypeLib(&pTypeLib,&TLindex); hrCheck(hr);
//Find CoClass'es in TypeLib - BTW Any comments on how to do this more efficient than a for-loop? UINT iTypeInfoCount = pTypeLib->GetTypeInfoCount(); for(UINT i(0); i < iTypeInfoCount; ++i) { TYPEKIND typeKind; hr = pTypeLib->GetTypeInfoType(i, &typeKind); hrCheck(hr); if(typeKind != TKIND_COCLASS) continue;
//Found a CoClass - now check for TYPEFLAG_FAPPOBJECT CComQIPtr<ITypeInfo> pAOTypeInfo; hr = pTypeLib->GetTypeInfo(i, &pAOTypeInfo); hrCheck(hr);
Jeg fandt selv fejlen... Det skulle være DISPATCH_METHOD|DISPATCH_PROPERTYGET
Synes godt om
Ny brugerNybegynder
Din løsning...
Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.