|
COM or not, the rule is:
If you are going to use CRT functions, then, by all means use _beginthreadex; if not, use CreateThread.
In COM, developers often avoid CRT (there is a macro in ATL to minimize the CRT overhead), and that's why they use CreateThread.
I vote pro drink
|
|
|
|
|
Hi Mark Nischalke,
No, the prefered method is _beginthreadex.
See Jeffrey Richter Win32 Article MSJ July 1999
Cheers
Ghazi
|
|
|
|
|
Thanks Ghazi, the article answered the questions.
|
|
|
|
|
Hi,
I found a mem leak problem with IWbemLocator::ConnectServer() interface
To reproduce this, compile and link and run the following program on Win2k SP2. I am using purify, so no need to run many rounds. But you do not have purify. Monitor it thru perfmon, you need loop thru many e.g. 20 different computers in your domain, and you will see each round you got around 12k mem leak.
If you think there is a delay to free issue change the Sleep call to make
it sleep for long enough, I tried 3 days. and it still leaks!!!
Any help would appreciated.!
***************************************************************
#define POLARITY
#define _WIN32_DCOM
#include <comdef.h>
#include <iostream>
using namespace std;
#include <iomanip>
#include <windows.h>
#include <chstring.h>
#include <chstrarr.h>
#include <assert.h>
#include <wbemidl.h>
#include <winbase.h>
int main(int argc, char **argv)
{
HRESULT hres;
START:
hres = CoInitializeEx(0, COINIT_MULTITHREADED); // Initialize COM.
if (FAILED(hres))
{
cout << "Failed to initialize COM library. Error code = 0x"
<< hex << hres << endl;
return 1; // Program has failed.
}
hres = CoInitializeSecurity(NULL, -1, NULL, NULL,
RPC_C_AUTHN_LEVEL_CONNECT,
RPC_C_IMP_LEVEL_IDENTIFY,
NULL, EOAC_NONE, 0
);
if (FAILED(hres))
{
cout << "Failed to initialize security. Error code = 0x"
<< hex << hres << endl;
CoUninitialize();
return 1; // Program has failed.
}
IWbemLocator *pLoc = 0;
hres = CoCreateInstance(CLSID_WbemLocator, 0,
CLSCTX_INPROC_SERVER, IID_IWbemLocator, (LPVOID *) &pLoc);
if (FAILED(hres))
{
cout << "Failed to create IWbemLocator object. Err code = 0x"
<< hex << hres << endl;
CoUninitialize();
return 1; // Program has failed.
}
IWbemServices *pSvc = 0;
for(int j=0;j<1;j++)
{
// Connect to the root\default namespace with the current user.
WCHAR Namespace[256];
swprintf(Namespace, L"\\\\%s\\root\\cimv2", L"tester");
hres = pLoc->ConnectServer(
_bstr_t(Namespace),
_bstr_t(L"user"),
_bstr_t(L"pwd"),
0,
0,
_bstr_t(L"NTLMDOMAIN:development"),
0,
&pSvc
);
if (FAILED(hres))
{
cout << "Could not connect node " << j << " Error code = 0x"
<< hex << hres << endl;
//pLoc->Release();
//CoUninitialize();
//return 1; // Program has failed.
}
else
{
cout << "Connected to WMI" << endl;
pSvc->Release();
}
}
pLoc->Release();
CoUninitialize();
Sleep(120000);
return 0; // Program successfully completed.
}
|
|
|
|
|
I'm a COM newbie and know very few of this topic.
What ist the difference between COM, DCOM, and COM+, and how do I best start learnig it ? Can you suggest any books ?
|
|
|
|
|
To learn what is the difference between these terms, following are some suggested books:
"Atl Developers Guide"
"The COM and COM+ Programming Primer"
"Mastering COM"
Regards,
ShadiK.
Shadi Al-Kahwaji
|
|
|
|
|
|
Essential COM by Don Box. The COM bible as far as I'm concerned and Don is the COM god.
ATL is the best way of developing COM objects. There are plenty of useful articles on getting started on MSDN in the Dr Gui columns.
Michael
|
|
|
|
|
Inside COM by Dale Rogerson is good.
It explains all the basics of COM thoroughly first without relying on ATL or MFC. Good if you want to learn basic COM before learning ATL.
Dave.
|
|
|
|
|
Thanks a lot for your replies.
|
|
|
|
|
I have a server and a client running on diffrent machines.
I want the client to activate methods on the server's machine.
is comm the answer for that?
if it is, how do i do it?
Yoav Zur
mailto: yoav_zur@mediguide.co.il
|
|
|
|
|
Hi,
Yes, COM is the answer. You can use Distributed COM (DCOM), or if you are using Windows2000 you can implement COM+ for this purpose. How you do it needs a lot of training on DCOM or COM+, I recommend the second one, which is COM+, if you have Windows2000 OS. To do this, take one of the good books like "Mastering DCOM", or "The COM and COM+ Programming Primer" and start from there.
Regards,
ShadiK.
Shadi Al-Kahwaji
|
|
|
|
|
I am trying to register a Shell Extension I write via:
regsrv32.exe myshell.dll
But I'm getting an error: 0x80070716
I can't find this anywhere and attempts to break it apart don't reveal anything. I'm using sample code from a project on this site and the sample project runs fine. At this point all I've changes is the GUIDs and the name of the Class. I've double and triple checked that my GUIDs are correct and nothing else is wrong. But, I keep getting this error code.
Can someone help me in figuring out what the problem is?
Thanks, RZ
|
|
|
|
|
The VC error lookup util says "The specified resource name cannot be found in the image file."
--Mike--
http://home.inreach.com/mdunn/
#include "witty_sig.h"
your with and
|
|
|
|
|
Well, that clears it right up!
I did stumble on this while looking at winerror.h, but figure it didn't apply. What image file? There is only one bitmap resource, and it looks fine. What other images could they be talking about? OR does "image" not really refer to a graphical image? Either way, I'm still lost and frustrated.
RZ
|
|
|
|
|
I was hoping that error would be meaningful to you. You can debug the registration process by going to your project settings, Debug tab, and set regsvr32.exe as the "executable for debug session." Then set a breakpoint at DllRegisterServer() and start single-stepping.
--Mike--
http://home.inreach.com/mdunn/
#include "witty_sig.h"
your with and
|
|
|
|
|
I deleted the project and started over, and now it works. I have no idea what I was doing wrong, but it must have been something subtle.
Thanks for your help (and your articles!!!)
RZ
|
|
|
|
|
VC++6 , W2k(sp2)
I created an MFC( Dynamic link ) DLL ,and I have put an ActiveX control on it.
When I Load the DLL and call the ActiveX's method i.e
"Play", then I am not able to access the window at all
( i.e cannot press any button ), because the window freezes.
Can someone please give me the solution
Thanks
Sanjay
|
|
|
|
|
Which classes of MFC are you using?
|
|
|
|
|
Hai Everyone!I have added a CommandBarButton and MenuBar in the Word2000 and Excel2000,using ATL and COM as well.My problem is I want to add a bitmap or icon to both the CommandBarButton and MenuItems .I want to do it using ATL and COM.Can anyone please suggest how can I do it.My emailid is ramachandrulasreeram@rediffmail.com.Please do reply me back as I need it urgently.
Regards
SreeRam
|
|
|
|
|
::OpenClipboard
::LoadImage
::SetClipboardData
::DeleteObject
::CloseClipboard
Office::_CommandBarButtonPtr::PasteFace
::EmptyClipboard
These are the methods in the order that you will need to call to get a custom bitmap onto a command bar button.
Cheers,
-Erik
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
My thoughts are my own and reflect on no other.
|
|
|
|
|
Hi Erik!
Thankz for u r timely help.
Regards
Sree Ram
|
|
|
|
|
Hi All,
I'm interested in your thoughts about the following:
I have created an ATL COM object with an interface that
consists of the methods Run and Stop. From a
client application I would like to be able to call the Run
method which causes my COM object to start a long
operation. However, the Run method should return immediately
because i don't want any multithreading code in my client.
The long operation can be stopped by calling the Stop method.
Currently, I create a worker thread in my objects Run method
and set a stop flag when the Stop method is called. The worker
thread periodically checks this flag and exits if it is set. For
this to work, my object is created in the MTA.
However, I have the feeling this can be done much simpler. (Also,
there are warnings everywhere about creating threads in COM objects)
I have looked into Asynchronous method calls but this limits my application
to Win2000 and does not work with IDispatch derived interfaces.
Any other idea's, pointers, samples ?
Thank you,
Alwin!
Alwin Beukers
|
|
|
|
|
I use that exact method, and it seems to work fine for me. The worker thread in the Run() method I mean.
If there is a classier way of doing it, I'd like to know.
J
|
|
|
|
|
I have an out of proc server, and a buggy beta-ish client. There is always only a single instance of both client and server. Quite frequently, the client crashes before releasing its server reference.
The one solution I've come up with for this problem, is to have the server keep track of when the client connects and disconnects (implement my own IConnectionPoints) so that if I get an Advise() call before the required Unadvise() call, I (the server) will decrement my own reference count.
Is this as evil as it sounds? I get the feeling this is a kludge solution, and I'm hoping y'all can help me out.
J
|
|
|
|