|
Hello.
Does anybody knows, how can i display information about COM(ActiveX) components activity.
I wanna trace all methods and properties in hooked DLLs(ActiveX) like COMslicer(www.comslicer.com).
Tell me please, where can i get sample codes. I looking for the sample codes for 3days. but I did't looked for that.
Thanks.
|
|
|
|
|
Hi!
Recently I've stumbled across a situation I could not explain - does anyone have an idea why this is so?
I had installed one of my applications from a Windows Installer package on a machine while being logged in as administrator and the application worked as expected.
After logging in as a regular user I got an error that a COM object I use couldn't be created and, indeed, the corresponding entry under HKCR\CLSID was not there!
I relogged as administrator and the entry was there again!
Up to then I was under the impression that the HKCR hive is NOT user dependent, but now I'm no longer sure. Can anyone explain this behaviour?
Thanks in advance!
Regards,
mav
--
Black holes are the places where god divided by 0...
|
|
|
|
|
Register your component in HKLM and if you your applications is maintaining the seetings for different user then you can register it under HKCU
Try to register your component in HKLM.
Cheers
Ganesh
Cheers
"Peace of mind through Technology"
|
|
|
|
|
Hi Ganesh!
Thanks for your reply, although unfortunately I can't see how to achieve this.
The component is a third-party control I cannot modify in any way. Calling DllRegisterServer for this component (by using regsvr32, as always) creates the registry entries in HKCR (that's the behaviour I know from each and every COM class I've created or used).
And it doesn't answer the question why HKCR\CLSID seems to be different depending on a special user login...
Regards,
mav
--
Black holes are the places where god divided by 0...
|
|
|
|
|
Even if you were able to register the component somewhere else than HKCR\CLSID, it wouldn't be found when an application calls ::CoCreateInstance() trying to create the component since HKCR\CLSID is where it shall be registered.
What do you know about the target environment? OS version, user rights and so on?
Are you able to open other CLSIDs?
--
Roger
It's supposed to be hard, otherwise anybody could do it!
|
|
|
|
|
Unfortunately, I don't have very much information about the target machine - it was a customer pc which I don't have access to anymore. It was an XP Prof SP1 machine IIRC, running in a hospital environment/network.
At the time I was installing we solved the problem by temporarily giving the user admin rights, reinstalling the application and then switching back to regular user rights again and afterwards I didn't get to dig deeper into their user management.
And yes, we were able to open other CLSIDs, at least another part of my program worked without problems or errors I'd got if some other COM objects and ActiveX controls wouldn't have been accessable.
Regards,
mav
--
Black holes are the places where god divided by 0...
|
|
|
|
|
hi all,
As i develop windows application in MFC and i am new to COM ,
for that which link or book are better to learn COM developement
send reply
-- modified at 5:09 Wednesday 22nd March, 2006
|
|
|
|
|
I have found Beginning ATL3 COM Programming by Richard Grimes pitty useful.
Z.A
|
|
|
|
|
Hi
I am reading about COM nowadays.
how can com achieve method calling between dlls which were coded different languages.
I mean every language has spesific calling convention mechanism.What is the solution to pass this problem?
I don't understan this issue.
And one more:
are there any more problems to call methods between dlls except calling conventions?
Regards.
|
|
|
|
|
COM methods use the __stdcall calling convention. COM compatible languages use the same __stdcall when calling COM methods. There are also various rules on parameter passing.
Steve
|
|
|
|
|
Hello.
I have a serious problem.
In the following codes, I always come to have false return.
Is there any problem in CLSID_UpdateServiceManager?
I have had a successful result by using VBScript, but VC++..
I'm looking forward to your answer.
///////// Always Fail /////////////////////////////////////////////
IUpdateServiceManager* pMgr;
hr = ::CoCreateInstance(CLSID_UpdateServiceManager, NULL, CLSCTX_INPROC_SERVER, IID_IUpdateServiceManager, (void**) &pMgr );
if (FAILED(hr))
{
m_pUnknown_Manager = NULL;
return false;
}
//////// Always Success ///////////////////////////////////////////
hr = ::CoCreateInstance(CLSID_UpdateSession, NULL, CLSCTX_INPROC_SERVER, IID_IUnknown, (LPVOID*)&m_pUnknown_Session);
if (FAILED(hr))
{
return false;
}
|
|
|
|
|
It sounds like the object (CLSID_UpdateServiceManager ) doesn't implement the IUpdateServiceManager interface. I'd wager the HRESULT is E_NOINTERFACE . Try this to convince yourself:
IUnknown *pUnk;
hr = ::CoCreateInstance(CLSID_UpdateServiceManager, NULL, CLSCTX_INPROC_SERVER, IID_IUnknown, reinterpret_cast<LPVOID*>(&pUnk));
if (FAILED(hr))
{
return false;
}
IUpdateServiceManager *pMgr;
hr = pUnk->QueryInterface(IID_IUpdateServiceManager, reinterpret_cast<LPVOID*>(&pMgr));
if (FAILED(hr))
{
pUnk->Release();
return false;
}
pMgr->Release();
pUnk->Release();
It is also possible the object is being accessed cross apartment and the proxy-stub doesn't exist - The object does implement the interface but it can't be marshaled across to the client apartment.
Steve
-- modified at 4:10 Tuesday 21st March, 2006
|
|
|
|
|
Thank you for concern.
I tested the code you sent, but the result is the same as the one which I've already had.
For your reference, the value of hr was -2147221231
See you.
|
|
|
|
|
Yeah, but on which line of my code did it fail - There are comments that say what the problem probably is.
-2147221231 is 0x80040111 in hex (don't quote HRESULT s in decimal!) which has the symbolic name CLASS_E_CLASSNOTAVAILABLE.
Steve
|
|
|
|
|
It was my purpose to convert the following VBScript to VC++ source code.
http://windowssdk.msdn.microsoft.com/library/en-us/wua_sdk/wua/using_wua_to_scan_for_updates_offline.asp?frame=true
The above vbs worked well, but the conversion fell in difficulty just after starting.
I'd had an experience using CLSID_UpdateSession, so I was quite frustrated.
In your convenient time, please check this matter.
Thanks.
|
|
|
|
|
Can you post the value of hr?
Also the CLSIDs are different in both your cases. Please ensure that both these classes suport IUpdateServiceManager.
If the requested interface is not supported, hr should be equal to E_NOINTERFACE.
Have a great day ahead!
Regards,
Sohail Kadiwala
(My Blog - http://blogs.wdevs.com/sohail/[^])
modified 21-Apr-21 21:01pm.
|
|
|
|
|
Thank you for concern.
The value of hr is -2147221231
Have a good day!
|
|
|
|
|
In the debugger, type this into the watch window: "hresult,hr". Assuming that hresult is the variable holding your error code, the debugger will present a human readable form, if there is any. Otherwise, please do the people here a favor, and present your error codes in the forum, using the hexadecimal form.
|
|
|
|
|
Can anyone tell me what this macro is meant for, and where I should use it.
Thanks
|
|
|
|
|
|
:-OHi, all experts:
I tried to create a COM local server and a client using win32 console application winzard in VC++ 6. When the client started up, it active the server automatically. The client also connected to server and called interface functions successfully. But, how can I terminate the server from client, before the client ended itselt?
Thanks a lot!
REMY
|
|
|
|
|
With COM objects you shouldn't need to take any explicit action to terminate the server beyond the normal reference counting calls to AddRef and Release you (and/or your smart pointers) do on the object's interfaces.
Steve
|
|
|
|
|
Yes. I wrote the 'Release' member for COM SEVER just as following:
ULONG CExeComServerConsole0_0::Release()
{
long nRefCount = InterlockedDecrement(&m_nRef) ;
if (nRefCount == 0)
delete this;
return nRefCount;
}
But, How can I teminate the server process?
|
|
|
|
|
Ok, you’re talking from the point of view of implementing the server, that wasn't clear in your post. Typically a global reference count is maintained which all implemented COM object increment when they're constructed and decrement when they're destructed. IClassFactory::LockServer also increments or decrements it based on its parameter - References on class factories should not influence this count. When the count transitions to zero the server typically wait for a timeout - If there is no activity and the timeout expires CoSuspendClassObjects is called and we arrange for the application to exit. In short it's complicated. Use ATL and you don't have to worry about any of this.
Steve
|
|
|
|
|
Thank you! Steve
I wanted to know more about the auto-ending of Server. I created a ATL EXE COM SERVER and used a client to conneted and disconnected it. After a moment, in system process list, the ATL EXE process disappeared. But, I didn't know when the CoSuspendClassObjects was called. Could you tell me more details. I'm learning COM/ATL. Thank you very much!
Sincerely
REMY
|
|
|
|