Click here to Skip to main content
15,888,096 members
Home / Discussions / COM
   

COM

 
AnswerRe: Component Services->COM+->Add new component hangs, C++ Unmanaged COM DLL using C# Pin
scottdj10-Mar-08 18:06
scottdj10-Mar-08 18:06 
GeneralRe: Component Services->COM+->Add new component hangs, C++ Unmanaged COM DLL using C# Pin
Scott Dorman11-Mar-08 4:33
professionalScott Dorman11-Mar-08 4:33 
AnswerRe: Component Services->COM+->Add new component hangs, C++ Unmanaged COM DLL using C# Pin
scottdj10-Mar-08 17:48
scottdj10-Mar-08 17:48 
GeneralRe: Component Services->COM+->Add new component hangs, C++ Unmanaged COM DLL using C# Pin
Scott Dorman11-Mar-08 4:28
professionalScott Dorman11-Mar-08 4:28 
QuestionRe: Component Services->COM+->Add new component hangs, C++ Unmanaged COM DLL using C# Pin
scottdj11-Mar-08 15:25
scottdj11-Mar-08 15:25 
GeneralRe: Component Services->COM+->Add new component hangs, C++ Unmanaged COM DLL using C# Pin
Scott Dorman12-Mar-08 2:38
professionalScott Dorman12-Mar-08 2:38 
GeneralGet "Title" information from files Pin
souljumper10-Mar-08 4:10
souljumper10-Mar-08 4:10 
QuestionHandling Internet Explorer com server object in plain C++ Pin
jattila4010-Mar-08 2:13
jattila4010-Mar-08 2:13 
I have written a small C++ program, what can download a HTML page from a specified URL, and writes its body to a specified file (this is a simple command line utility). It is almost fine, but in few cases the Internet Explorer causes application error (instruction at address xxxx memory address xxxx can not be read, where to xxxx-s are same usually), immediately before my program finishes (or after, I don't know). I suspect, that this is a synchronization problem, may be I destroy some object (IWebBrowser2 or IConnectionPoint) too early, but I am unable to find this bug. I append my source code, please help me to find the bug. The code is commented in english, and in hungarian. Sorry for my english. Thanx in advance.

#include <windows.h><br />
#include <exdisp.h><br />
#include <mshtml.h><br />
#include <stdio.h><br />
#include <winnls.h><br />
#include <comdef.h><br />
#include <conio.h><br />
#include <exdispid.h><br />
//#include <dispatch.h><br />
#include <oleauto.h><br />
<br />
#define WM_CONNECTRELEASE WM_USER+100<br />
#define TIMEOUT 30000 //30 seconds<br />
<br />
#define PUT(x) x<br />
<br />
int DocumentDownloaded=0;<br />
<br />
class Sink : public IDispatch //It is enough to implement only the IDispatch interface instead of DWebBrowserEvents2,<br />
							//becouse we handle all events in IDispath::Invoke function<br />
{<br />
public:<br />
//IUnknown<br />
	virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID riid,void __RPC_FAR *__RPC_FAR *ppvObject)<br />
	{<br />
		PUT(printf("QueryInterface\r\n");)<br />
		if(riid==IID_IUnknown || riid==IID_IDispatch || riid==DIID_DWebBrowserEvents2 || riid==DIID_DWebBrowserEvents){<br />
			*ppvObject=(void*)this;<br />
			AddRef();<br />
			return S_OK;<br />
		}<br />
		else{<br />
			*ppvObject=NULL;<br />
			return E_NOINTERFACE;<br />
		}<br />
	}  <br />
    <br />
	virtual ULONG STDMETHODCALLTYPE AddRef() <br />
	{<br />
		PUT(printf("AddRef\r\n");) <br />
		//return 1;<br />
		InterlockedIncrement(&m_cRef);<br />
		return m_cRef;<br />
	}  <br />
<br />
	virtual ULONG STDMETHODCALLTYPE Release()<br />
	{<br />
		//return 1;<br />
		if(m_cRef>0)InterlockedDecrement(&m_cRef);<br />
		if(m_cRef==1){<br />
			//az IE befejezte a Sink hasznalatat, meghivhato az IConnectionPoint::Release<br />
			//IE stopped using Sink, we may call IConnectionPoint::Release<br />
			PostMessage(0,WM_CONNECTRELEASE,0,0); //we send message to the message loop<br />
		}<br />
		PUT(printf("Release %d\r\n",m_cRef);)<br />
		return m_cRef;<br />
	}<br />
// IDispatch<br />
	virtual HRESULT STDMETHODCALLTYPE GetTypeInfoCount(UINT __RPC_FAR *pctinfo)<br />
	{<br />
		PUT(printf("GetTypeInfoCount\r\n");)<br />
		return E_NOTIMPL;<br />
	}<br />
<br />
	virtual HRESULT STDMETHODCALLTYPE GetTypeInfo(UINT iTInfo,LCID lcid,ITypeInfo __RPC_FAR *__RPC_FAR *ppTInfo)<br />
	{<br />
		PUT(printf("GetTypeInfo\r\n");) <br />
		return E_NOTIMPL;<br />
	}<br />
 <br />
	virtual HRESULT STDMETHODCALLTYPE GetIDsOfNames(<br />
		/* [in] */ REFIID riid,<br />
		/* [size_is][in] */ LPOLESTR __RPC_FAR *rgszNames,<br />
		/* [in] */ UINT cNames,<br />
		/* [in] */ LCID lcid,<br />
		/* [size_is][out] */ DISPID __RPC_FAR *rgDispId)<br />
	{<br />
		PUT(printf("GetIDsOfNames\r\n");)<br />
		return E_NOTIMPL;<br />
	}<br />
       <br />
	virtual /* [local] */ HRESULT STDMETHODCALLTYPE Invoke(<br />
		/* [in] */ DISPID dispIdMember,<br />
		/* [in] */ REFIID riid,<br />
		/* [in] */ LCID lcid,<br />
		/* [in] */ WORD wFlags,<br />
		/* [out][in] */ DISPPARAMS __RPC_FAR *pDispParams,<br />
		/* [out] */ VARIANT __RPC_FAR *pVarResult,<br />
		/* [out] */ EXCEPINFO __RPC_FAR *pExcepInfo,<br />
		/* [out] */ UINT __RPC_FAR *puArgErr);<br />
//Sink<br />
	Sink(IWebBrowser2 *pWebBrowser,HANDLE fo):m_pWebBrowser(pWebBrowser),m_cRef(1),m_pIConnectionPoint(0),m_dwEventCookie(0),m_hOutputFile(fo)<br />
	{<br />
<br />
	}<br />
<br />
	~Sink()<br />
	{<br />
<br />
	}<br />
<br />
	bool SetupConnectionPoint();<br />
<br />
	void UnadviseConnectionPoint()<br />
	{<br />
		if(m_pIConnectionPoint){<br />
			PUT(printf("Before Connectionpoint Unadvise\r\n");)<br />
			m_pIConnectionPoint->Unadvise(m_dwEventCookie);<br />
			m_dwEventCookie=0;<br />
			//vigyazat szinkronizacios problema!!!<br />
			//az Unadvise utan meg az IE visszahivja a Release (az Invoke-ot talan nem) callbacket.<br />
			//nem szabad tovabbmeni, amig a callbackek le nem futnak.<br />
<br />
			//Be care, synchronization problem may occure!<br />
			//After m_pIConnectionPoint->Unadvise(m_dwEventCookie), IE calls back Sink::Release 4 times,<br />
			//since we must not proceed until the last Sink::Release called by IE, has been finished.<br />
			PUT(printf("Before Connectionpoint Release\r\n");)<br />
			//m_pIConnectionPoint->Release();<br />
			//PUT(printf("After Connectionpoint Release\r\n");)<br />
			//m_pIConnectionPoint=NULL;<br />
		}<br />
	}<br />
<br />
	ULONG ReleaseConnectionPoint()<br />
	{<br />
		ULONG ret=0;<br />
		if(m_pIConnectionPoint!=NULL){<br />
			ret=m_pIConnectionPoint->Release();<br />
			m_pIConnectionPoint=NULL;<br />
		}<br />
		PUT(printf("After Connectionpoint Release\r\n");)<br />
		return ret;<br />
	}<br />
<br />
protected:<br />
<br />
	IWebBrowser2 *m_pWebBrowser;<br />
	IConnectionPoint *m_pIConnectionPoint;<br />
	DWORD m_dwEventCookie;<br />
	LONG m_cRef;<br />
	HANDLE m_hOutputFile;<br />
};<br />
<br />
int DownloadDocument(IWebBrowser2 *pBrowser2,HANDLE fo)<br />
{<br />
	IDispatch *pDoc=NULL;<br />
	IHTMLDocument2 *pHtmlDoc=NULL;<br />
	IHTMLElement *body=NULL;<br />
	HGLOBAL hg=NULL;<br />
	BSTR bstr=NULL;<br />
	HRESULT hr;<br />
	int ret=0;<br />
<br />
	if(!SUCCEEDED(pBrowser2->get_Document(&pDoc))){<br />
		goto vege;<br />
	}<br />
	if(!SUCCEEDED(pDoc->QueryInterface(IID_IHTMLDocument2,(void **)&pHtmlDoc))){<br />
		pHtmlDoc=NULL;<br />
		goto vege;<br />
	}<br />
	if(!SUCCEEDED(pHtmlDoc->get_body(&body))){<br />
		goto vege;<br />
	}<br />
	if(!SUCCEEDED(body->get_innerText(&bstr))){<br />
		goto vege;<br />
	}<br />
	hr=SysStringByteLen(bstr)/2;<br />
<br />
	unsigned long m;<br />
	char c;<br />
	int i;<br />
	for(i=0;i<hr;++i){><br />
		c=bstr[i];<br />
		WriteFile(fo,&c,1,&m,NULL);<br />
	}<br />
	ret=1;<br />
	/*<br />
	if((hg=GlobalAlloc(GMEM_MOVEABLE | GMEM_NODISCARD,10000))!=NULL){<br />
		ULARGE_INTEGER size;<br />
		DWORD err;<br />
		IStream* pMyStream;<br />
		ULONG n;<br />
		IPersistStreamInit* pPersist = 0;<br />
<br />
		err=CreateStreamOnHGlobal(hg,TRUE,&pMyStream);<br />
		HRESULT hr=pDoc->QueryInterface(IID_IPersistStreamInit, (void**)&pPersist);<br />
		if (SUCCEEDED(hr) && pPersist){<br />
			if(bstr!=NULL)SysFreeString(bstr);<br />
			CloseHandle(fo);<br />
			hr=pPersist->InitNew();<br />
			hr=pPersist->GetSizeMax(&size);<br />
			hr=pPersist->Save(pMyStream, false);<br />
			hr=S_OK;<br />
			while(hr==S_OK){<br />
				hr=pMyStream->Read((void *)t,1000,&n);<br />
			}<br />
			hr=pMyStream->Read((void *)t,1000,&n);<br />
			pPersist->Release();<br />
		}<br />
	}<br />
	*/<br />
vege:<br />
	if(pHtmlDoc!=NULL)pHtmlDoc->Release();<br />
	return ret;<br />
}<br />
<br />
bool Sink::SetupConnectionPoint()<br />
{<br />
	//Ez a fuggveny a m_pWebBrowser tagban megadott IWebBrowser2 szerver objektumban megkeresi a <br />
	//DWebBrowserEvents2 tipusu connection pointot, es a Sink kliens objektumot (jelen objektum)<br />
	//hozza kapcsolja. A szerver objektum a Sink tagfuggvenyeit mint callback fuggvenyeket<br />
	//fogja meghivni a kulonbozo esemenyek hatasara.<br />
<br />
	//This function searches the DWebBrowserEvents2 type connection point in the IWebBrowser2 type<br />
	//server object (pointed to by m_pWebBrowser member), and connects the Sink object (present object)<br />
	//to it. The IWebBrowser2 server object will call back the member functions of this Sink object.<br />
	IConnectionPointContainer* pIConnectionPointContainerTemp=NULL;<br />
	IUnknown *pIUnknown=NULL;<br />
	bool ret=true;<br />
	/*QI this object itself for its IUnknown pointer which will be used */<br />
	/*later to connect to the Connection Point of the IWebBrowser2 object.*/<br />
	//this -> <br />
	if(!SUCCEEDED(QueryInterface(IID_IUnknown,(void**)&pIUnknown))){<br />
		ret=false;<br />
		pIUnknown=NULL;<br />
		goto vege;<br />
	}<br />
	/* QI IWebBrowser2 for its connection point.*/<br />
	if(!SUCCEEDED(m_pWebBrowser->QueryInterface(IID_IConnectionPointContainer,(void**)&pIConnectionPointContainerTemp))){<br />
		ret=false;<br />
		pIConnectionPointContainerTemp=NULL;<br />
		goto vege;<br />
	}<br />
	if(!SUCCEEDED(pIConnectionPointContainerTemp->FindConnectionPoint(DIID_DWebBrowserEvents2,&m_pIConnectionPoint))){<br />
		ret=false;<br />
		m_pIConnectionPoint=NULL;<br />
		goto vege;<br />
	}<br />
	if(!SUCCEEDED(m_pIConnectionPoint->Advise(pIUnknown,&m_dwEventCookie))){<br />
		ret=false;<br />
		m_dwEventCookie=0;<br />
		m_pIConnectionPoint->Release();<br />
		m_pIConnectionPoint=NULL;<br />
		goto vege;<br />
	}<br />
vege:<br />
	if(pIUnknown!=NULL)pIUnknown->Release();<br />
	if(pIConnectionPointContainerTemp!=NULL)pIConnectionPointContainerTemp->Release();<br />
	return ret;<br />
}<br />
<br />
HRESULT STDMETHODCALLTYPE Sink::Invoke(<br />
		/* [in] */ DISPID dispIdMember,<br />
		/* [in] */ REFIID riid,<br />
		/* [in] */ LCID lcid,<br />
		/* [in] */ WORD wFlags,<br />
		/* [out][in] */ DISPPARAMS __RPC_FAR *pDispParams,<br />
		/* [out] */ VARIANT __RPC_FAR *pVarResult,<br />
		/* [out] */ EXCEPINFO __RPC_FAR *pExcepInfo,<br />
		/* [out] */ UINT __RPC_FAR *puArgErr)<br />
{<br />
	PUT(printf("Invoke %d\r\n",dispIdMember);) <br />
	//GetTypeInfo(0,NULL,&m_ptinfo);<br />
	//return DispInvoke(this,m_ptinfo,dispIdMember, wFlags, pDispParams,pVarResult, pExcepInfo, puArgErr); <br />
	if(dispIdMember==DISPID_DOCUMENTCOMPLETE){<br />
		PUT(printf("Document complete\r\n");)<br />
		IUnknown*  pUnk;<br />
		LPDISPATCH lpWBDisp,lpDisp;<br />
		HRESULT    hr;<br />
<br />
		lpDisp=pDispParams->rgvarg[1].pdispVal;<br />
		//hr = m_pWebBrowser->QueryInterface(IID_IDispatch,(void **)&lpWBDisp);<br />
		hr=m_pWebBrowser->QueryInterface(IID_IUnknown,(void **)&pUnk);<br />
		hr=pUnk->QueryInterface(IID_IDispatch, (void**)&lpWBDisp);<br />
<br />
		if(lpDisp==lpWBDisp){<br />
			// Top-level Window object, so document has been loaded<br />
			PUT(printf("Page complete\r\n");)<br />
			DocumentDownloaded=DownloadDocument(m_pWebBrowser,m_hOutputFile);<br />
			//PostQuitMessage(0);<br />
			HRESULT hr;<br />
			hr=m_pWebBrowser->Quit();<br />
			PUT(printf("Quit %d\r\n",hr);)<br />
		}<br />
<br />
		lpWBDisp->Release();<br />
		pUnk->Release();<br />
		return S_OK;<br />
	}<br />
	else if(dispIdMember==DISPID_ONQUIT){<br />
		//PostQuitMessage(0);<br />
		UnadviseConnectionPoint();<br />
		return S_OK;<br />
	}<br />
	else{<br />
		return E_NOTIMPL;<br />
		//return S_OK;<br />
	}<br />
}<br />
<br />
int main(int argc,char *argv[])<br />
{<br />
	HANDLE fo=INVALID_HANDLE_VALUE;<br />
	int ret=0;<br />
	Sink *psink=NULL;<br />
	IWebBrowser2 *pBrowser2=NULL;<br />
	VARIANT vEmpty;<br />
	WCHAR wurl[MAX_PATH];<br />
	VariantInit(&vEmpty);<br />
	BSTR bstrURL=NULL;<br />
<br />
	DocumentDownloaded=0;<br />
<br />
	if(argc<3){<br />
		printf("\r\Usage: iecom <url> <output file="">");<br />
		return 1;<br />
	}<br />
<br />
	if((fo=CreateFile(argv[2],GENERIC_WRITE,0,NULL,CREATE_ALWAYS,FILE_ATTRIBUTE_NORMAL,NULL))==INVALID_HANDLE_VALUE){<br />
		return 1;<br />
	}<br />
<br />
	//bstrURL-ben eloallitjuk az URL-t<br />
	if(MultiByteToWideChar(CP_ACP,0,argv[1],-1,wurl,MAX_PATH)==0 || (bstrURL=SysAllocString(wurl))==NULL){<br />
		CloseHandle(fo);<br />
		return 1;<br />
	}<br />
<br />
	if(!SUCCEEDED(OleInitialize(NULL))){<br />
		ret=1;<br />
		goto vege;<br />
	}<br />
		<br />
	//Letrhozzuk az IE objektumot<br />
	if(!SUCCEEDED(CoCreateInstance(CLSID_InternetExplorer,NULL,CLSCTX_LOCAL_SERVER,IID_IWebBrowser2,(void**)&pBrowser2)) || pBrowser2==NULL){<br />
		ret=1;<br />
		goto vege;<br />
	}<br />
<br />
	//hr=LoadTypeLib(L"shdocvw.dll",&pTypeLib);<br />
	//hr=GetTypeInfoOfGuid(DIID_DWebBrowserEvents2,&pTypeInfo);<br />
	psink=new Sink(pBrowser2,fo);<br />
	if(psink==NULL || !psink->SetupConnectionPoint()){<br />
		ret=1;<br />
		HRESULT hr;<br />
		hr=pBrowser2->Quit();<br />
		PUT(printf("Quit %d\r\n",hr);)<br />
		hr=pBrowser2->Release();<br />
		PUT(printf("Webbrowser Release %d\r\n",hr);)<br />
		goto vege;<br />
	}<br />
<br />
	if(!SUCCEEDED(pBrowser2->put_Visible(VARIANT_FALSE)) || !SUCCEEDED(pBrowser2->Navigate(bstrURL,&vEmpty,&vEmpty,&vEmpty,&vEmpty))){<br />
		ret=1;<br />
		HRESULT hr;<br />
		hr=pBrowser2->Quit();<br />
		PUT(printf("Quit %d\r\n",hr);)<br />
	}<br />
	<br />
	//A program leallas menete:<br />
	//1. Ha a dokumentum letoltodott, vagy timeout kovetkezik be, akkor leallitjuk a webbrosert pBrowser2->Quit() -tel<br />
	//2. A webbrowser quit uzenetet kuld, amit a sink lekezel, es <br />
	//   meghivja a Sink UnadviseConnectionPoint fuggvenyet, amely a connection point unadvise fuggvenyet hivja<br />
	//3. A connection point unadvise hatasara a webbrowser 4-szer meghivja a Sink::Release fuggvenyt<br />
	//   Meg kell varni a Sink::Release hivasok befejezodeset, csak ezutan lehet Release-elni a connection point-ot! (fontos! kulonben vagy a program, vagy az IE kiakadhat szinkronizacios problema miatt).<br />
	//   Ezert a Sink::Release-ben figyelni kell, mikor engedi el a webbrowser a Sink-et (amikor az m_cRef dekrementalas utan 1 lesz).<br />
	//4. Mikor a webbrowser elengedte a Sink-et, egy WM_CONNECTRELEASE (=WM_USER+100) uzenetet postolunk az uzenet ciklusnak.<br />
	//5. A WM_CONNECTRELEASE lekezelesekent meghivjuk a  Sink::ReleaseConnectionPoint fuggvenyt, amely meghivja a connection point Release fuggvenyet.<br />
	//6. Release-eljuk a Sink-et es a webbrowsert.<br />
	//Ha elobb a connection point-ot release-eljuk, es utana hivjuk meg a webbrowser Quit-jet,<br />
	//elofordulhat, hogy a Sink-et a webbrowser meg nem engedte el (az utolso Sink::Release meg az IE-ben nem futott le)<br />
	//es az IE, a pBrowser2->Quit() hatasara fellepo OnQuit esemenyt, a mar kozben release-elt <br />
	//connection point-on keresztul probalja elkuldeni a Sink-nek. Ebben az esetben az IE kiakadhat (szinkronizacios problema).<br />
<br />
	//Scenario of program stopping:<br />
	//1. If page downloaded, or timeout has occured, we stop the webbrowser by pBrowser2->Quit().<br />
	//2. The webbrowser sends quit message, which is handled by Sink, and calls the Sink::UnadviseConnectionPoint<br />
	//   member function, which calls the IConnectionPoint::Unadvise.<br />
	//3. IConnectionPoint::Unadvise causes the webbrowser to call back the Sink::Release 4 times.<br />
	//   We MUST wait for the last Sink::Release to complete, <br />
	//   only after this the IConnectionPoint::Release can be called. (it is important, otherwise<br />
	//   either our program or IE may cause application error becouse of synchronization problem).<br />
	//   For this reason we must trace in the Sink::Release, when the webbrowser releases the Sink.<br />
	//   (when the m_cRef becomes 1 after decrement).<br />
	//4. When the webbrowser released the Sink, we post a WM_CONNECTRELEASE (=WM_USER+100) windows<br />
	//   message to the message loop.<br />
	//5. By handling WM_CONNECTRELEASE windows message in message loop, we call the Sink::ReleaseConnectionPoint<br />
	//   member funtion, which calls IConnectionPoint::Release.<br />
	//6. We call IWebBrowser2::Release, Sink::Release, OleUninitialize.<br />
	UINT timer;<br />
	timer=0;<br />
	timer=SetTimer(NULL,0,TIMEOUT,NULL); //30 masodperces timeout varakozas a Sink::Invoke callbackre<br />
	MSG msg;<br />
	while(1){<br />
		GetMessage(&msg,0,0,0);<br />
		PUT(printf("WinMessage %d\r\n",msg.message);)<br />
		if(msg.message==WM_TIMER){<br />
			//timeout-tal kilepunk<br />
			if(DocumentDownloaded==0){<br />
				//utolso esely. Ha esetleg a callback nem lett meghivva, mert pl. nem erkezett meg a megfelelo esemeny<br />
				DownloadDocument(pBrowser2,fo);<br />
			}<br />
			HRESULT hr;<br />
			hr=pBrowser2->Quit();<br />
			PUT(printf("Quit %d\r\n");)<br />
		}<br />
		else if(msg.message==WM_CONNECTRELEASE){<br />
			//a Sink::Release-tol jott, jelezve, hogy az IConnectionPoint::Release <br />
			//biztonsagosan meghivhato, mert az IE befejezte a Sink hasznalatat.<br />
<br />
			//This message came from Sink::Release, signing the IE has finished using the Sink,<br />
			//so we can call IConnectionPoint::Release safely (I hope at least).<br />
			PUT(printf("ReleaseConnectionPoint\r\n");)<br />
			ULONG rel;<br />
			rel=psink->ReleaseConnectionPoint();<br />
			PUT(printf("Connection point Release %d\r\n",rel);)<br />
			rel=pBrowser2->Release();<br />
			PUT(printf("Webbrowser Release %d\r\n",rel);)<br />
			psink->Release();<br />
			break;<br />
		}<br />
		//TranslateMessage(&msg);<br />
		DispatchMessage(&msg);<br />
	}<br />
	if(timer!=0)KillTimer(NULL,timer);<br />
vege:<br />
	if(psink!=NULL)delete psink;<br />
	SysFreeString(bstrURL);<br />
	OleUninitialize();<br />
	PUT(printf("After OleUninitialize\r\n");)<br />
	CloseHandle(fo);<br />
	return ret;<br />
}</output></url></hr;++i){></oleauto.h></dispatch.h></exdispid.h></conio.h></comdef.h></winnls.h></stdio.h></mshtml.h></exdisp.h></windows.h>

GeneralRe: Handling Internet Explorer com server object in plain C++ Pin
jattila4010-Mar-08 3:48
jattila4010-Mar-08 3:48 
GeneralLink File Path Pin
john56329-Mar-08 22:25
john56329-Mar-08 22:25 
QuestionCOM Interop C++ unmanaged through C# .NET 2.0 Class Library to C# .NET 1.1managed Class Library Pin
scottdj8-Mar-08 18:33
scottdj8-Mar-08 18:33 
QuestionRe: COM Interop C++ unmanaged through C# .NET 2.0 Class Library to C# .NET 1.1managed Class Library Pin
scottdj8-Mar-08 18:36
scottdj8-Mar-08 18:36 
GeneralRe: COM Interop C++ unmanaged through C# .NET 2.0 Class Library to C# .NET 1.1managed Class Library Pin
Scott Dorman10-Mar-08 15:49
professionalScott Dorman10-Mar-08 15:49 
Generalusing com without registration Pin
justintimberlake8-Mar-08 16:31
justintimberlake8-Mar-08 16:31 
GeneralRe: using com without registration Pin
User 2155979-Mar-08 3:14
User 2155979-Mar-08 3:14 
GeneralRe: using com without registration Pin
justintimberlake9-Mar-08 16:52
justintimberlake9-Mar-08 16:52 
GeneralRe: using com without registration Pin
User 21559710-Mar-08 11:32
User 21559710-Mar-08 11:32 
GeneralProxy Manager on Remote Clients Pin
swjam7-Mar-08 22:04
swjam7-Mar-08 22:04 
GeneralEvent Map of an ActiveX control Pin
AbbyIndian6-Mar-08 6:59
AbbyIndian6-Mar-08 6:59 
QuestionCOM Addin crashes Excel. What am I doing wrong? Pin
ssaddi3-Mar-08 19:35
ssaddi3-Mar-08 19:35 
GeneralRe: COM Addin crashes Excel. What am I doing wrong? Pin
Nathan Holt at EMOM4-Mar-08 9:42
Nathan Holt at EMOM4-Mar-08 9:42 
GeneralRe: COM Addin crashes Excel. What am I doing wrong? Pin
ssaddi4-Mar-08 10:58
ssaddi4-Mar-08 10:58 
GeneralRe: COM Addin crashes Excel. What am I doing wrong? Pin
Nathan Holt at EMOM4-Mar-08 11:15
Nathan Holt at EMOM4-Mar-08 11:15 
QuestionRe: COM Addin crashes Excel. What am I doing wrong? Pin
Nathan Holt at EMOM6-Mar-08 4:45
Nathan Holt at EMOM6-Mar-08 4:45 
GeneralRe: COM Addin crashes Excel. What am I doing wrong? Pin
ssaddi6-Mar-08 10:15
ssaddi6-Mar-08 10:15 

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.