Click here to Skip to main content
15,892,746 members
Home / Discussions / COM
   

COM

 
GeneralRe: Create C++ COM DLL by using Visual Studio.Net 2003 Pin
Martin Koorts18-Jan-05 0:58
Martin Koorts18-Jan-05 0:58 
GeneralMs project server controls Pin
amalatsliit17-Jan-05 18:07
amalatsliit17-Jan-05 18:07 
Generalinstalling components... Pin
oxygen_fiend17-Jan-05 10:40
oxygen_fiend17-Jan-05 10:40 
Questionhow to open webbrowser window Pin
devom16-Jan-05 20:59
devom16-Jan-05 20:59 
AnswerRe: how to open webbrowser window Pin
Martin Koorts16-Jan-05 23:16
Martin Koorts16-Jan-05 23:16 
GeneralIDL question Pin
LasVegasGuy14-Jan-05 7:06
LasVegasGuy14-Jan-05 7:06 
GeneralRe: IDL question Pin
Jörgen Sigvardsson16-Jan-05 12:04
Jörgen Sigvardsson16-Jan-05 12:04 
GeneralInvoking methods on interface marked as appobject from C++ client Pin
Martin Andersen14-Jan-05 1:33
Martin Andersen14-Jan-05 1:33 
Hi!

It's possible to mark a CoClass as "appobject". This enables VBScript clients to use methods in this object globally. However, I'm not able to use these methods from a C++ client.

The following example tries to invoke the "CentimetersToPoints" method, which is global in the Word-typelib. Just create a Win32 console app with ATL support and paste it in...

What am I doing wrong? Confused | :confused:

Sincerely
-Broholm

<br />
// ATLGlobal.cpp : Defines the entry point for the console application.<br />
//<br />
<br />
/* Should do the same as the following .vbs file (which works)<br />
<br />
Dim w<br />
<br />
Set w = CreateObject("Word.Application")<br />
<br />
MsgBox(w.CentimetersToPoints(0.5))<br />
<br />
Set w = Nothing	<br />
<br />
*/<br />
<br />
/* IDL for CentimetersToPoints is:<br />
<br />
[id(0x00000173), helpcontext(0x09700173)]<br />
HRESULT CentimetersToPoints(<br />
                [in] single Centimeters, <br />
                [out, retval] single* prop);<br />
<br />
*/<br />
<br />
<br />
//This is for demonstration purposes only - <br />
//Pardon the hardcoding of method names and values, and forgetting to invoke Quit method. <br />
//I'm also aware that not all resources is released<br />
<br />
#include "stdafx.h"<br />
<br />
#define hrCheck(hr) if(FAILED(##hr)) {  return -1;};<br />
<br />
int _tmain(int argc, _TCHAR* argv[])<br />
{<br />
	::CoInitialize(NULL);<br />
	{ //<-- Scope to force CComPtr destructors before ::CoUninitialize()<br />
	CComBSTR ProgId("Word.Application");<br />
	HRESULT hr; <br />
<br />
	CComPtr<IUnknown> pUnk;<br />
	hr = pUnk.CoCreateInstance(ProgId,NULL,CLSCTX_SERVER);<br />
	hrCheck(hr);<br />
	<br />
	CComQIPtr<IDispatch> pDisp;<br />
	hr = pUnk.QueryInterface(&pDisp);<br />
	hrCheck(hr);<br />
<br />
	DISPID dispIdClass;<br />
	CComBSTR MethodName("CentimetersToPoints");<br />
	hr = pDisp->GetIDsOfNames(IID_NULL,&MethodName,1,LOCALE_USER_DEFAULT,&dispIdClass);<br />
	hrCheck(hr);<br />
<br />
	CComVariant vArg(0.5);<br />
	hr = vArg.ChangeType(VT_R4); //lpfuncdesc->lprgelemdescParam[0].tdesc.vt is 4 => VT_R4<br />
	hrCheck(hr);<br />
	DISPID dispidNamedArgs	= -1;<br />
	<br />
	DISPPARAMS dpArgs;<br />
	dpArgs.cArgs			= 1;<br />
	dpArgs.cNamedArgs		= 0;<br />
	dpArgs.rgvarg			= &vArg;<br />
	dpArgs.rgdispidNamedArgs = &dispidNamedArgs;<br />
<br />
	EXCEPINFO e;<br />
	CComVariant vResult;<br />
	//vResult.ChangeType(VT_R4); //<--- Even tried this :-(<br />
	UINT puArgErr(0);<br />
<br />
	hr = pDisp->Invoke(dispIdClass,IID_NULL,LOCALE_USER_DEFAULT,DISPATCH_METHOD,&dpArgs,&vResult,&e,&puArgErr); //<-- FAILS with hr = E_FAIL<br />
	if(FAILED(hr))<br />
		std::cout << "Invoke failed" << std::endl;<br />
	//Ok that one fails - now get the appobject coclass and invoke thru that interface<br />
	//Get TypeLib<br />
	CComPtr<ITypeInfo> pTI;<br />
	hr = pDisp->GetTypeInfo(0,LOCALE_USER_DEFAULT,&pTI);<br />
	CComQIPtr<ITypeLib> pTypeLib;<br />
	UINT TLindex(0);<br />
	hr = pTI->GetContainingTypeLib(&pTypeLib,&TLindex);<br />
	hrCheck(hr);<br />
<br />
	//Find CoClass'es in TypeLib - BTW Any comments on how to do this more efficient than a for-loop?<br />
	UINT iTypeInfoCount = pTypeLib->GetTypeInfoCount(); <br />
	for(UINT i(0); i < iTypeInfoCount; ++i)				<br />
	{<br />
		TYPEKIND typeKind;								<br />
		hr = pTypeLib->GetTypeInfoType(i, &typeKind);<br />
		hrCheck(hr);<br />
		if(typeKind	!= TKIND_COCLASS) <br />
			continue;<br />
<br />
		//Found a CoClass - now check for TYPEFLAG_FAPPOBJECT<br />
		CComQIPtr<ITypeInfo> pAOTypeInfo;<br />
		hr = pTypeLib->GetTypeInfo(i, &pAOTypeInfo);<br />
		hrCheck(hr);<br />
<br />
		TYPEATTR* pAOTypeAttr;<br />
		hr = pAOTypeInfo->GetTypeAttr(&pAOTypeAttr);<br />
		hrCheck(hr);<br />
		if((pAOTypeAttr->wTypeFlags	& TYPEFLAG_FAPPOBJECT) != TYPEFLAG_FAPPOBJECT)<br />
		{<br />
			pAOTypeInfo->ReleaseTypeAttr(pAOTypeAttr);<br />
			continue;<br />
		};<br />
<br />
		//Found AppObject<br />
		CComBSTR name;<br />
		hr = pTypeLib->GetDocumentation(i, &name, 0, 0,	0);<br />
		hrCheck(hr);<br />
		<br />
		//Enumerate the coclass's interfaces (only one in this case)<br />
		for(int	j(0); j	< pAOTypeAttr->cImplTypes; ++j)<br />
		{<br />
			//Get GUID of implemented interface<br />
			CComQIPtr<ITypeInfo> pAOTypeInfoImpl;<br />
			HREFTYPE hRefType;<br />
			hr = pAOTypeInfo->GetRefTypeOfImplType(j,&hRefType);<br />
			hrCheck(hr);<br />
			hr = pAOTypeInfo->GetRefTypeInfo(hRefType,&pAOTypeInfoImpl);<br />
			hrCheck(hr);<br />
			TYPEATTR* pAOTypeAttrImpl;<br />
			hr = pAOTypeInfoImpl->GetTypeAttr(&pAOTypeAttrImpl);<br />
			hrCheck(hr);<br />
<br />
			//Create instance of coclass, requesting the implemented interface<br />
			CComPtr<IDispatch> pAODisp;<br />
			hr = pAOTypeInfo->CreateInstance(NULL,pAOTypeAttrImpl->guid,(void**)&pAODisp);<br />
			pAOTypeInfoImpl->ReleaseTypeAttr(pAOTypeAttrImpl);<br />
			hrCheck(hr);<br />
<br />
			//Get ID and Invoke<br />
			hr = pAODisp->GetIDsOfNames(IID_NULL,&MethodName,1,LOCALE_USER_DEFAULT,&dispIdClass);<br />
			hrCheck(hr);<br />
			hr = pAODisp->Invoke(dispIdClass,IID_NULL,LOCALE_USER_DEFAULT,DISPATCH_METHOD,&dpArgs,&vResult,&e,&puArgErr);<br />
			hrCheck(hr); //<---	Still fails! :-(<br />
<br />
		};<br />
		pAOTypeInfo->ReleaseTypeAttr(pAOTypeAttr);<br />
	};<br />
	};<br />
	::CoUninitialize();<br />
	return 0;<br />
}<br />

GeneralRe: Invoking methods on interface marked as appobject from C++ client Pin
Vi214-Jan-05 4:36
Vi214-Jan-05 4:36 
GeneralRe: Invoking methods on interface marked as appobject from C++ client Pin
Martin Andersen14-Jan-05 4:45
Martin Andersen14-Jan-05 4:45 
GeneralRe: Invoking methods on interface marked as appobject from C++ client Pin
Vi214-Jan-05 5:35
Vi214-Jan-05 5:35 
GeneralFound it! Pin
Martin Andersen14-Jan-05 7:23
Martin Andersen14-Jan-05 7:23 
GeneralCOM : +/- ATL Pin
Malcolm Smart14-Jan-05 1:11
Malcolm Smart14-Jan-05 1:11 
GeneralRe: COM : +/- ATL Pin
Martin Koorts14-Jan-05 3:15
Martin Koorts14-Jan-05 3:15 
GeneralRe: COM : +/- ATL Pin
Jörgen Sigvardsson16-Jan-05 12:08
Jörgen Sigvardsson16-Jan-05 12:08 
Generalhelp on openwith dialog Pin
deepakskumar12-Jan-05 21:21
deepakskumar12-Jan-05 21:21 
QuestionHow do you free a COM library in Visual Basic? Pin
zumichu11-Jan-05 12:13
zumichu11-Jan-05 12:13 
AnswerRe: How do you free a COM library in Visual Basic? Pin
Martin Koorts12-Jan-05 0:40
Martin Koorts12-Jan-05 0:40 
AnswerRe: How do you free a COM library in Visual Basic? Pin
Anonymous13-Jan-05 1:36
Anonymous13-Jan-05 1:36 
GeneralRe: How do you free a COM library in Visual Basic? Pin
geo_m16-Jan-05 20:42
geo_m16-Jan-05 20:42 
GeneralRe: How do you free a COM library in Visual Basic? Pin
zumichu27-Jan-05 8:30
zumichu27-Jan-05 8:30 
Generalasfds Pin
Anonymous8-Jan-05 5:39
Anonymous8-Jan-05 5:39 
GeneralRe: asfds Pin
Jörgen Sigvardsson8-Jan-05 6:15
Jörgen Sigvardsson8-Jan-05 6:15 
GeneralRe: asfds Pin
User 21559710-Jan-05 20:55
User 21559710-Jan-05 20:55 
GeneralRe: asfds Pin
Jörgen Sigvardsson10-Jan-05 20:59
Jörgen Sigvardsson10-Jan-05 20:59 

General General    News News    Suggestion Suggestion    Question Question    Bug Bug    Answer Answer    Joke Joke    Praise Praise    Rant Rant    Admin Admin   

Use Ctrl+Left/Right to switch messages, Ctrl+Up/Down to switch threads, Ctrl+Shift+Left/Right to switch pages.