|
HI,
I m new to ATL DLL
I want to make a Dll from which i want to get the functionality of CSocket class through ASP.NEt.
I run the ATL COM wizrad use ATL DLL , soporting MFC , proxt stub , MTS all ..
I added a MFC Class CSock Inherited from CSocket class.
When i compile it . it gives error .
CSocket undefined ???????????
How i can handle it.
and i want to use this DLL for ASP.NEt page to give the functionalty to a ASP.Net page connect to a client application through IP and Port.
m i doing a right solution. means ATL DLL , and use this DLL behind a ASP.NET page.
and tell me y CSocket is Undefined
thanx
Regards.
|
|
|
|
|
I have a ATL dialog class based on CAxDialogImpl. And I have added message handler for WM_CREATE for it:
BEGIN_MSG_MAP(CMyDialog)
...
MESSAGE_HANDLER(WM_CREATE, OnCreate)
MESSAGE_HANDLER(WM_DESTROY, OnDestroy)
CHAIN_MSG_MAP(CAxDialogImpl<cmydialog>)
DEFAULT_REFLECTION_HANDLER()
END_MSG_MAP()
And when instance of it is created through:
CMyDialog dlg;
dlg.Create(::GetDesktopWindow());
it does not receive the WM_CREATE notification.
Interestingly, it Does receive WM_DESTROY notification.
Am i missing something?
|
|
|
|
|
Dialogs don't receieve WM_CREATE . They do receive WM_INITDIALOG though - that's the message you want to trap. This applies for all dialogs, active x or not.
--
Arigato gozaimashita!
|
|
|
|
|
I need to take an opinion on whether our approach is right (described below):
Problem
We have a ATL windows service which also exposes one COM class - say MainServer. MainServer interacts with other internal COM objects and a VB ActiveX control. Client application can instantiate MainServer component and fire some methods on it. The VB ActiveX control needs a form container - so we are using ATL dialog (invisible, modeless) to host it. And fire methods on the dialog.
Output
Service when tested through control panel GUI, it works perfectly and we can fire methods on ActiveX control through its container in ServiceWinMain(), Run() and other methods.
But when tested with Client application which instantiates MainServer and fires methods, we have an unspecified exception.
My questions are:
1. Is it possible to host ATL dialog like I mentioned in a Windows service?
2. What is the best way to make this application thread safe?
3. Is this approach right?
|
|
|
|
|
Someone wrote:
2. What is the best way to make this application thread safe?
Is STAs possible when running as a service? If so, then COM solves it for you. If not, I'd use the locking mechanisms built into ATL to protect the COM objects against unsafe parallell access.
I suppose your COM component inherits from either CComObjectRoot or template <typename ThreadingModel> CComObjectRootEx . Make sure you inherit from CComObjectRootEx<CComMultiThreadModel> and use the Lock() and Unlock() methods appropriately. You can also use the type ObjectLock if you need to lock temporarily using the RAII idiom. ObjectLock lock(this); calls Lock() at construction time and Unlock() at destruction time.
Other than that I can't be of much more help as I don't have experience with COM servers in services.
--
Arigato gozaimashita!
|
|
|
|
|
Thanks Jörgen,
Solution did not require me to use Locks. But your answer did give a spark to think in a particular direction and finally I reached a solution.
Suchit.
(why doesn't my name appear besides by posting? I am logged in using my CodeProject ID).
|
|
|
|
|
You're welcome! May I ask how you solved it?
Someone wrote:
why doesn't my name appear besides by posting? I am logged in using my CodeProject ID
I believe it's because you are using HTML commands in your name. Your name shows up as <font face= in the email notification. Try changing your CP settings.
--
Arigato gozaimashita!
|
|
|
|
|
I am sorry about saying that this problem is solved.
Actaully the problem of crash/exception remains where it was.
However initially hosting activex control in invisible, and modeless ATL dialogs was not achieved by me, now it is possible.
|
|
|
|
|
I oftenly encounter the need of using the ATLControls.h header file for compiling some of the ATL codes. But according to the source codes. It is not supported by Ms. Any better replacement for this or there are updated version of similar kind.
thank you.
Sonork 100.41263:Anthony_Yio
|
|
|
|
|
You've probably seen atlctrls.h , which is a WTL header file (despite its atl prefix).
--
Arigato gozaimashita!
|
|
|
|
|
|
Hi!
I've implemented a thumbnail extension for windows xp explorer by implementing the IExtractImage interface. The super weird part is about windows passing the desired BPP on GetLocation().
In Explorer: When the left bar, with the Information box, is active: windows requires 32bpp. And shows my image stretched (as wide as possible, and then super heigh).
When in normal thumbnail mode, windows requires 24bpp: but it won't show the thumbnail unless it's 1bpp or 32bpp! If I force feed it 32bpp the thumbnail is shown nicely (not stretched as in the Information box).
Does anyone have any idea as of why?
Thanx
/JP
|
|
|
|
|
Hello
I have used standard template library in one of my applications. I belive that memory leaks are due to stl components, mainly string. i wrote a sample program in VC 6.0 that clearly shows memory leaks in stl
wstring str = L"";
for( int a = 0 ; a < 100000 ; a++ )
{
str += L"int";
}
str.str.erase( str.begin() , str.end() );
str = L"int";
i wrote this code against a button in dialog based application. Before clicking the button, the memory usage is 3MB and after this code it is 17MB although i believe it should have been back to 3MB after the statement str.str.erase( str.begin() , str.end() ).
My other observation is that if i exit the application in debug mode it tells almost everything about the memory leaks except for the file from which memory was allocated. I copied a code that would tell the file but it would all leaks are from crtdbg.h
i need to know how to get memory statistics low.any help in this regard will be highly appreciated.
P.S. I have been using Task Manager to see how much memory is bieng used by my application.
Regards
Omar Javed
|
|
|
|
|
str.erase( str.begin() , str.end() ) does not delete the storage the string uses. Try str.swap(wstring()) . This swaps str with a temporary wstring and then should destruct the temporary, freeing the storage originally used by str .
HTH
Stuart Dootson
'Java, Basic, who cares - it's all a bunch of tree-hugging hippy cr*p'
|
|
|
|
|
Shouldn't a call to reserve() do fine?
--
...Coca Cola, sometimes war...
|
|
|
|
|
Hmmm - I thought string was like vector - which it isn't entirely, now that I check - you can call reserve to aattempt to reduce the amount of allocated storage.
However, both the C++ Standard and MSDN say that it's non-binding (i.e. the library doesn't have to honour your request). And the STL with VC++ 7.1 doesn't honour requests with capacity less than the current size (i.e. it won't shrink strings). So half a mark each - strictly, you can try to use reserve like this, but in practise, it doesn't shrink string allocations.
Stuart Dootson
'Java, Basic, who cares - it's all a bunch of tree-hugging hippy cr*p'
|
|
|
|
|
That sounds like bad design. They ought to replace the reserve() function and with a set_capacity() function IMO.
--
...Coca Cola, sometimes war...
|
|
|
|
|
I'm having quite a problem. I have a class that has this attribute: a vector template. Something like the following:
<br />
extern "C" class __declspec(dllexport) AnotherClass { ... };<br />
<br />
extern "C" class __declspec(dllexport) MyClass<br />
{<br />
private:<br />
vector<AnotherClass> m_vecClass;<br />
};<br />
When I compile it, I get this warning message:
warning C4251: 'm_vecClass' : class 'std::vector<AnotherClass,class std::allocator<class AnotherClass> >' needs to have dll-interface to be used by clients of class 'MyClass'.
I don't know what to do, though I guess I should do something like
<br />
__declspec(dllexport) vector<AnotherClass> m_vecClass<br />
Still, it is not working.
I hope someone can help me. Thanks a lot.
|
|
|
|
|
|
You can't extern "C" a class. A class is a C++ specific feature, and I don't see how you could give it a C compatible linkage.
--
...Coca Cola, sometimes war...
|
|
|
|
|
I use extern "C" for the mangling. If I do not add extern "C", the compiler mangles the class as it wish, and there is no standard for that. So even when the class is a C++ class, if I create a class in Visual C++ and try to import it from its DLL with a Borland C++, it will not compile.
The use of extern "C" prevents the compiler of this mangling situation. Like the use of ordinals in a MAKE file.
Fools say I know you don't know,
silence like a cancer grows;
hear my words, that I might teach you;
take my arms, that I might reach you;
but my words like silence raindrops fell...
echoed the will of silence.
|
|
|
|
|
I use extern "C" for the mangling. If I do not add extern "C", the compiler mangles the class as it wish, and there is no standard for that. So even when the class is a C++ class, if I create a class in Visual C++ and try to import it from its DLL with a Borland C++, it will not compile.
The use of extern "C" prevents the compiler of this mangling situation. Like the use of ordinals in a MAKE file.
Fools say I know you don't know,
silence like a cancer grows;
hear my words, that I might teach you;
take my arms, that I might reach you;
but my words like silence raindrops fell...
echoed the will of silence.
|
|
|
|
|
I see..
--
...Coca Cola, sometimes war...
|
|
|
|
|
AFAIK you CANNOT share C++ code compiled with one vendor's compiler for use by another vendor's compiler. So if you write a C++ class in MSVC and make it into a DLL, you can't then use that dll/class with another vendor's compiler (like Borland). The problem is that each vendor has different ways of layout various C++ internals, such as virtual function tables, multiple inheritance, name mangling (for function overloading, a C++ feature), etc. Plus other features, like operator new/delete may be done differently and the vendor's underlying C Runtime may have a different memory manager, which will cause problems for stuff like the STL (classes like std::basic_string use the C runtime).
Part of the reason for COM was that C++ couldn't be shared this way. You'll note that when application's expose their API for 3rd party plug-ins in C++ they ALWAYS state the compiler you have to use. For example, Alias|Wavefront's Maya program (a powerful 3D Editor) has a sophisticated plugin API in C++, but you MUST use the MS VC compiler to develop for it - you can't use Borland, Digital Mars, GCC or anything else.
This is a known problem, and so far the vendor's have never agreed to a common C++ ABI. It's slightly less of a problem on other platforms, but it's still there. For example on linux most people use GCC and the GCC folks have published and (supposedly) adhere to an open binary ABI for C++. Mac OS X also shares this ABI and I believe that vendor's like Metroworks also honor it (at least on OS X).
¡El diablo está en mis pantalones! ¡Mire, mire!
Real Mentats use only 100% pure, unfooled around with Sapho Juice(tm)!
SELECT * FROM User WHERE Clue > 0
0 rows returned
|
|
|
|
|
You have to export an explicit instantiation of vector<AnotherClass> . The procedure is thoroughly explained in this MSKB article[^].
Joaquín M López Muñoz
Telefónica, Investigación y Desarrollo
|
|
|
|