|
What if you issue a WM_PAINT after assignment ?
|
|
|
|
|
Hi,
I am developing multithreading COM EXE server. In one of the methods I have called CoCreateInstance, which is made threadsafe by using CSingleLock(&(oneMutext)). The first 2 or 3 instances of CoCreateInstance always succeded. But after some time, call to CoCreateInstance raises an exception. Also heap get corrupted at this point.
Can anybody help me in resolving this issue.
Thanks & Regards,
Mandar
|
|
|
|
|
Are you calling CoInitialize() when entering a thread, and CoUnitialize() when leaving the thread ?
DarkByte
|
|
|
|
|
Hi,
I have a hard questions regarding Shell Namespace Extensions.
I am researching the possiblity of having the following:
1. A shell namespace extension that when installed appears as a new "drive" in the Explorer folder tree, and it shows a tree of "folders" containing "files" the user can browse like a normal drive.
2. Users can open/save files to these "virtual folders" like a normal drive in say MSWord just using the File Open/etc dialogs [so my extension must appear in these dialogs as if it were a normal drive].
3. Programmers can open/create/write/etc using normal API. This will need to be done using .Net, so using System.IO.File , etc. Also need to manipulate directories this way.
I am happy to have to do: FileStream* fs = System.IO.File::Create("mydrivetype:\\x\y\z\abc.txt"); kind of thing.
The extension will not be storing files on the regular file system [or it may, but this is not a requirement], for example, it could be storing to a remote server [maybe like those FTP drives], or through a remote WebService, through HTTP, or to a local database [I need to be really flexible here, I have several possible uses for this technology, so the underlying storage mechansm will be dependant on my implemetation, but it will always expose files and directories.]
(1) is okay.
My problem is doing number (2) and (3).
I have looked at IStorage, IPersistFile, and Asyncronous Pluggable Protocols, but I am not really sure how one would go about doing these things.
What I am hoping to get is some comments on
(a) is this possible?
(b) tips/hints/advice on how best to do (2)/(3), links, even books!!
Many many thanks in advance!!!
Mark
|
|
|
|
|
I'm not the authority in this domain but if i recall from other threads i've seen, you're going to need the DDK to develop this kind of application. What you need looks like a system driver.
And althought i can't be sure, i believe there is a price attached to it too, because even if normal DDK is free, DDK that change file system are worth like 899$ US.
But see what others can come up with, maybe i'm missing a detail somewhere.
DarkByte
|
|
|
|
|
Given the limitations of comercial solutions, I'm writing a custom app installation utility. I'm writing it in a generic manner. However, the application I'm initially writing it for has a mixture of .NET and ASP 3.0/COM+ functionality. As such, from managed code, I need to be able to:
- Create/Delete COM+ Applications and set properties.
- Register/Unregister COM+ components (unmanaged code, NOT assemblies) in those applications and set properties.
I've written a class that successfully creates applications and adds components. However, when using COMAdminCatalog.InstallComponent() to register and add components to the application it adds exactly 18 entries to the registry. By contrast, simply registering a component and its type library from the commandline using regsvr32 adds only 10.
My Issue: Using either COMAdminCatalog.Remove() or resvr32 /u doesn't remove ALL registry entries, but leaves 6 entries, all under HKLM\SOFTWARE\Microsoft\COM3\SelfReg. The entries left in there include a CLSID, ProgID and type library.
My Question: I've searched the .NET fx high and low and looked for options for interop, all to no avail. How do I programmatically remove ALL references of a COM+ DLL from the registry so as not to cause any potential conflicts (DLL hell) in future upgrades where binary compatibility is broken? Thanx!
Boyd Campbell
Systems Engineer
|
|
|
|
|
How about deleting the Tree of keys yourself ?
I'm my COM Component, i delete keys under INTERFACE,APPID,CLSID using a tree delete function .. i delete all keys and subkeys from my classid and under in these 3 keys
|
|
|
|
|
Well, I was hoping there was a programmatic way (via an API perhaps) that does it for me. It seems an oversight to me that using the COMAdminCatalog functionality will register in those locations and yet there's no converse to those actions exposed on that server. Rather dissappointing.
|
|
|
|
|
I understand your disappointment, but sometimes stuff is done a certain for a reason which isnt always obvious at first. Or it could be a bug.
so, until someone brings you a reason or a fix, i suggest you try with a simple registry tree flushing function ! (be careful not to delete all keys).
|
|
|
|
|
Thanx bud...do you have a C# snippet? Doesn't have to be C# though...I'll take whatever you may have. Thanx again.
|
|
|
|
|
Sorry, i dont have time to make a C# sample but check within namespace Microsoft.Win32, you will find classes for Registry and RegistryKey, check info on these and you probably can code something quick.
|
|
|
|
|
Yea...I've actually done a lot with the items that MS.Win32 exposes. I was just looking for the quick way out.
Thanks for your help sir.
|
|
|
|
|
Hi i have actually posted this question in ATL section
I have recieve a few tlb from a vendor . in these tlb there is only interfaces with no coclass at all.
Can any body teach me how to use this interface or point me to a sample
thanks
PS: sorry for double posting, need it urgently
|
|
|
|
|
I've been looking at methods of implementing realtime file monitoring. I have looked at validtec's API hooking SDK, which is not ideal for my purposes.
Alfa's File monitor COM component is superb...
My question is:
Does anybody know of any other alternatives?
Just another copy and paste artist
|
|
|
|
|
You can use this window api FindFirstChangeNotification
it is easy to use, fast and low cpu consumption
|
|
|
|
|
Thank you,
That is fantastic and perfect!
Just another typist
|
|
|
|
|
I have a dialog that hosts an IE ActiveX component. My OnDocumentComplete looks like this:
bool CMyClass::ParseDoc(CComPtr[IHTMLDocument2] pDoc){...};
bool CMyClass::ParseDoc(CComPtr[IXMLDOMDocument] pDoc){...};
void __stdcall CMyClass::OnDocumentComplete(IDispatch* pDisp, VARIANT* URL)
{
if (m_pBrowser == (IWebBrowser2*)pDisp)
{
CComPtr<IDispatch> pDispatch;
m_pBrowser->get_Document(&pDispatch);
CComQIPtr[IHTMLDocument2] pHTMLDoc;
CComQIPtr[IXMLDOMDocument] pXMLDoc;
if ((pHTMLDoc = pDispatch) && ParseDoc(pHTMLDoc))
{
...
}
if ((pXMLDoc = pDispatch) && ParseDoc(pXMLDoc))
{
...
}
pDispatch.Release();
}
}
The problem is, even when the document is an XML document, the QueryInterface for IHTMLDocument works, but the QI for IXMLDOMDocument fails. This seems like the way to do it, but I guess not. How can I proccess the document without knowing wether it's going to be HTML or XML?
Thank you.
|
|
|
|
|
Hi there,
I believe it's because IE does not load XML into an XMLDOMDocument, it treats it the same as though it was HTML. The reason why it displays differently is because it loads a pre-defined XSLT (res://msxml.dll/DEFAULTSS.xsl) that transforms the XML contents into the XML view you normally see in IE.
My advise would be to grab the IHTMLDocument2, get the body->innerText that will give you the contents and either look for "<?" or look for <html> then load the contents into your own IXMLDOMDocument (through loadXML).
The best way would be to get hold of the content type set for the document, however the mimeType property on the IHTMLDocument2 interface always returned "ASP.NET Web Page" on my test web server, whether it was HTML or XML being sent back.
Hope this helps,
Andy
|
|
|
|
|
Thanks Andy, I wish there was a cleaner way to do it, but I think this will work for me.
|
|
|
|
|
Hi,
I've a pretty basic question on ActiveX control.
I've an activeX control developed using Microsoft Visual C++ 6.0 based on ATL framework. I have the first version shipped to the customers already.
Now, I've a newer version of the component, and I'm trying to up the version so that users would get the latest copy downloaded automatically when they visit the site.
Can someone tell me how I increase the version number ?, please. I use the OBJECT tag in my HTML page to refer to the control. Would increasing the version number take care of downloading the latest version even if an older version is present on the client machine ?
-Thanks/Sudha
|
|
|
|
|
I have a COM EXECUTABLEserver made in Delphi 6 and a client made in Visual C++ MFC. I can make a client that uses the connection points in Delphi, but not in Visual C++.
I noticed that the cookie in the Advise function is 1. Does anybody have a sample of this kind of project?
ahmad
|
|
|
|
|
Hi ahmad,
To implement connection points in MFC create a class derived of CCmdTarget, e.g:
class CMyEvent : public CCmdTarget
{
DECLARE_DYNCREATE(CMyEvent)
CMyEvent();
public:
public:
public:
virtual void OnFinalRelease();
protected:
virtual ~CMyEvent();
DECLARE_MESSAGE_MAP()
afx_msg void AnEvent1(short param1);
afx_msg void AnEvent2(short param1);
DECLARE_DISPATCH_MAP()
DECLARE_INTERFACE_MAP()
};
and for implementation...
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif
IMPLEMENT_DYNCREATE(CMyEvent, CCmdTarget)
CMyEvent::CMyEvent()
{
EnableAutomation();
}
CMyEvent::~CMyEvent()
{
}
void CMyEvent::OnFinalRelease()
{
CCmdTarget::OnFinalRelease();
}
BEGIN_MESSAGE_MAP(CMyEvent, CCmdTarget)
END_MESSAGE_MAP()
BEGIN_DISPATCH_MAP(CMyEvent, CCmdTarget)
DISP_FUNCTION(CMyEvent, "AnEvent1", AnEvent1, VT_EMPTY, VTS_I2)
DISP_FUNCTION(CMyEvent, "AnEvent2", AnEvent2, VT_EMPTY, VTS_I2)
END_DISPATCH_MAP()
static const IID IID_IMyEvents =
{0x71294e8f,0x16b0,0x11d4,{0x81,0x37,0x00,0xc0,0x4f,0x43,0x6d,0x97}};
BEGIN_INTERFACE_MAP(CMyEvent, CCmdTarget)
INTERFACE_PART(CMyEvent, IID_IMyEvents, Dispatch)
END_INTERFACE_MAP()
void CMyEvent::AnEvent1(short param1)
{
}
void CMyEvent::AnEvent2(short param1)
{
}
(Look on MSDN for DISP_FUNCTION macro to see all the different param types)
Once you have the implementation of the connection points, then create an instance and query the object for the container Interface. Once you have that use FindConnectionPoint passing the IID of the connection point you are interested in, call GetIDispatch(FALSE) on your instance, and pass this through the connection points Advise method.
Don't forget to Unadvise passing the cookie when you are all done.
Hope this has helped,
Andy
|
|
|
|
|
Some of you may start naming me The Dll-hell-Man.
I really have to get my problem solved!!!
What may be wrong when
m_ptr.CreateInstance("MyDll.Class")
returns "Invalid class string"
I've looked in the registry and find a string "MyDll.Class".
The realy strange thing is that calling MyDlldll works perfect on my deveoping CPU but when running it on another CPU after regisering MyDll.dll I got the
"Invalid class string"
message.
Please - Make my Day - APe
_____________________________
...and justice for all
APe
|
|
|
|
|
Did the registration work properly on the other computer?
Try running Oleview.exe (it's in the tools directory in the Visual Studio program directory), and see if you can find and instantiate the COM class from there.
--
Ich bin Joachim von Hassel, und ich bin Pilot der Bundeswehr.
Welle: Erdball - F104-G Starfighter
|
|
|
|
|
OK I'll try that.
Is the "Oleview.exe" about the same program as "Dependency Walker"?
Tackar - Jörgen
_____________________________
...and justice for all
APe
|
|
|
|
|