|
howdy all-
My current problem: I've got this ISAPI DLL, which does some stuff and generates XML. It's written in C++, uses MSXML3, and run's inside DLLHOST...
Oh, and it leaks memory.
(1) Is there a good way to debug this?
(2) If I could convert this to a stand-alone exe, I could attach a debug memory manager.... Can this be done -- can I make an ATL/IIS server extension which is also an exe. (is this what's called an out-of-process server?)
Thanks in advance!
Regards
-peter
P.S. I think I do ask some of the more esoteric questions on this site.... I hope someone has some help or direction for me. Thanks
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br />
Peter Weyzen<br />
Staff Engineer<br />
<A HREF="http://www.santacruznetworks.com">Santa Cruz Networks</A>
|
|
|
|
|
Compile a debug version of your DLL and attach your debugger to DLLHOST.exe. Debug as usual.
|
|
|
|
|
oh...
I wish it were that simple....
But tracking memory leaks is the real problem...
and it's not MFC....
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br />
Peter Weyzen<br />
Staff Engineer<br />
<A HREF="http://www.santacruznetworks.com">Santa Cruz Networks</A>
|
|
|
|
|
I'm not sure I understand what your getting at. You asked "Is there a good way to debug this?". I explained how to do this. Why is it any different to track memory leaks in a dll? What does MFC have to do with anything?
|
|
|
|
|
Forgive me for my ignorance in this arena.
It's code that was kinda thrown at me, and finally given all responsibility to figure out.
I'll be more specific. It's an ISAPI DLL which mines data out of our servers, generates some XML and passes it back to IIS for display.
Upon repeated use, it leaks memory...
My attempts to locate the memory leak are failing, and i am flailing
Maybe you could tell me the best way to detect memory leaks in a situation like this?
Thanks
-peter
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br />
Peter Weyzen<br />
Staff Engineer<br />
<A HREF="http://www.santacruznetworks.com">Santa Cruz Networks</A>
|
|
|
|
|
|
Thanks for the reference.
I've always wondered where that came from. It's something you get by default using MFC. (that's where my MFC remark came from).
Anyhow -- thanks
-peter
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br />
Peter Weyzen<br />
Staff Engineer<br />
<A HREF="http://www.santacruznetworks.com">Santa Cruz Networks</A>
|
|
|
|
|
Some memory leak tips, start looking for misbehaving BSTRS, unreleased components and unfreed mallocs.
Also you can use the perfmon and taskmanager to monitor the memory as you debug...
sun.lcr
|
|
|
|
|
I should assert here that I undersand the basics of memory leak issues. But I need "special help" in the area of an IIS addin (ISAPI DLL).
What's special about this kinda of app, is:
* you write a dll
* it get's loaded either directly by IIS (inetinfo.exe)
* or indirectly via DLLHOST
* you don't have much control of the environment
All of the standard memory leak issues are covered.
* balancing a delete for every new
* releasing COM stuff
The unknowns are:
* ISAPI DLL issues
* BSTR's
* MSXML3 memory issues
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br />
Peter Weyzen<br />
Staff Engineer<br />
<A HREF="http://www.santacruznetworks.com">Santa Cruz Networks</A>
|
|
|
|
|
why not write you own dllhost and call/load the isap dll from there. this way you would have complete control of the loading process. as you know by now, the isapi dll is nothing more than a regular dll with a bunch of entry points of which only 2 or 3 are the most important ones.
In any case, you can create a special entry point to fake the call for iis and watch the memory run...
just a thought...
sun.lcr
|
|
|
|
|
Do you know of a good reference "out there somewhere" that details this?
[i have too many tasks on my plate to re-invent this]
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br />
Peter Weyzen<br />
Staff Engineer<br />
<A HREF="http://www.santacruznetworks.com">Santa Cruz Networks</A>
|
|
|
|
|
not really, I had a similar experience with windows services where they run in the background and are hard to reach via the debugger. I took control of taht by creating a main function that can be compiled into an exe and the service portion is a dll. the main portion had all the serivce handles and that allows me to control what gets loaded where. I also had to spend some three month back and forth with MS but in the final analysis it was my main that really helped me.
I have a book at home that details the isapi ia easy to understand format, i'll get the ref number and email it to you tomorrow...
as they used to say a few months back... hope is on the way....
sun.lcr
|
|
|
|
|
Thanks!
It is most appreciated!
~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~<br />
Peter Weyzen<br />
Staff Engineer<br />
<A HREF="http://www.santacruznetworks.com">Santa Cruz Networks</A>
|
|
|
|
|
Hi
I have a listview on which I need to edit the subitem in a column in-place. A twist to the tail is that the specified column needs to be in edit mode whenever the list has focus (and that the list needs to be focussed when the dialog pops...)
This is on a modal dialog CAxDialogImpl. I use a CContainedWindow member variable (initialised as of type Edit in the constructor of the dialog class) to create a edit box, with the Listview as parent, and the subitems rectangle whenever the dialog signals edit mode (listview focussed and idle).
Problem is that my edit box displays - but fails to display a cursor of its text - untill the columnwidth gets narrowed and expanded by mouse drag!
Second Question: How to modify Listview row height programmatically?
Relevant sections of code:
*.h:
class CCashDlg :
public CAxDialogImpl<ccashdlg>
{
// Construction
public:
CContainedWindow m_cwEdit;
LRESULT OnEditKillFocus(int idCtrl, LPNMHDR pnmh, BOOL& bHandled);
void EditTenderAmount(LVITEM & lvItem);
CCashDlg(); // standard constructor
~CCashDlg(); // standard destructor
// Dialog Data
//{{AFX_DATA(CCashDlg)
enum { IDD = IDD_CASHDLG };
// NOTE: the ClassWizard will add data members here
//}}AFX_DATA
BEGIN_MSG_MAP(CCashDlg)
NOTIFY_HANDLER( IDC_EDIT_LBL, NM_KILLFOCUS, OnEditKillFocus)
REFLECT_NOTIFICATIONS()
ALT_MSG_MAP(1)
MESSAGE_HANDLER(WM_SETFOCUS, OnSetEditFocus)
REFLECT_NOTIFICATIONS()
END_MSG_MAP()
LRESULT OnSetEditFocus(UINT uMsg, WPARAM wParam, LPARAM lParam, BOOL& bHandled);
// Implementation
protected:
HWND m_HWNDEdit;
private:
//
};
//*.cpp
CCashDlg::CCashDlg() :
m_cwEdit(_T("Edit"), this, 1)
{
//{{AFX_DATA_INIT(CCashDlg)
// NOTE: the ClassWizard will add member initialization here
//}}AFX_DATA_INIT
m_HWNDEdit = 0;
}
void CCashDlg::EditTenderAmount(LVITEM & lvItem)
{
HWND hWndlist = GetDlgItem(IDC_LIST_SPLIT_CASH) ;
DWORD dwStyle = WS_CHILD | WS_VISIBLE | ES_AUTOHSCROLL |
ES_MULTILINE | ES_AUTOVSCROLL | WS_TABSTOP ;
//DWORD dwStyle = WS_CHILD|WS_VISIBLE|WS_CLIPSIBLINGS|WS_TABSTOP|WS_BORDER|ES_LEFT;
DWORD dwExStyle = WS_EX_CLIENTEDGE;
if (m_Timer )
{
KillTimer( m_Timer);
m_Timer = 0;
}
RECT rectSub ;
BOOL bGetRect = ListView_GetSubItemRect(hWndlist, lvItem.iItem, 4,LVIR_BOUNDS, &rectSub );
if ( !(BOOL)m_HWNDEdit)
{
m_HWNDEdit = m_cwEdit.Create((HWND) hWndlist ,/*(RECT *) &*/ rectSub, /*(LPCTSTR)*/ "", (DWORD) dwStyle, (DWORD) dwExStyle ); //, (UINT ) NULL , (LPVOID) NULL) ;
ATLASSERT((BOOL) m_HWNDEdit );
TCHAR pszText[22] ;
::SetWindowText(m_HWNDEdit, "TEST" /*pszText*/);
//LONG_PTR lptrStyle = ::GetWindowLongPtr( m_HWNDEdit, GWL_STYLE );
//::SetWindowLongPtr( m_HWNDEdit, GWL_STYLE, lptrStyle | WS_VISIBLE ) ;
::PostMessage(m_HWNDEdit, WM_SHOWWINDOW, 1,0);
::PostMessage(m_HWNDEdit, WM_SETFOCUS, NULL, 0);
//::SetActiveWindow( m_HWNDEdit) ;
::PostMessage(m_HWNDEdit, EM_SETSEL, 0, -1);
}
else // we already have a window - just move it
{
::MoveWindow( m_HWNDEdit , rectSub.left , rectSub.top ,
rectSub.right - rectSub.left ,
rectSub.bottom - rectSub.top , TRUE);
//::SetWindowPos( HWND hWndInsertAfter,rectSub.left, rectSub.top, 0, 0, SWP_NOSIZE|SWP_SHOWWINDOW );
::PostMessage(m_HWNDEdit, WM_SHOWWINDOW, 1,0);
::PostMessage(m_HWNDEdit, WM_SETFOCUS, NULL, 0);
::PostMessage(m_HWNDEdit, EM_SETSEL, 0, -1);
}
}
What am I missing??
Any advice appreciated
JacquesJTheron
|
|
|
|
|
I seemed to have found the answer to the first question above - the message map to the setfocus of the dynamically created contained window edit box, has an out parameter called bHandled. It defaults to (BOOL) TRUE - and thus the normal setfocus process is not completed. If the notification changes this value to bHandled = FALSE, windows / atl handles the screen refreshing and adds a cursor, paints the text, etc.
Maybe this will help someone out their...
jacquesjtheron
|
|
|
|
|
I have built a interface as below:
HRESULT GetBSTR1([out,retval]BSTR* bstrInfo);
If VBScript call this component method the codes as below:
Set aaa = CreateObject("ATLTest.TestOne")
v1=aaa.GetBSTR1()
MsgBox v1
OK
and if I build my interface into
HRESULT GetBSTR2([out]BSTR* bufName1,[out,retval]BSTR* bufName2);
how the VBScript call this method
|
|
|
|
|
I Don't know about vbscript but in VB
Dim a As New TESTCOM1Lib.TestInterface
Dim str, str1 As String
str = a.GetBSTR2(str1)
MsgBox str1, vbOKOnly, str
-----------------------------
"I Think this Will Help"
-----------------------------
Alok Gupta
visit me at http://www.thisisalok.tk
|
|
|
|
|
Sorry I haven't ever learned VB
Private Sub Form_Load()
Dim a As New ATLTESTLib.ITestTWO
Dim str, str1 As String
str = a.GetBSTR2(str1)
MsgBox str1, vbOKOnly, str
End Sub
Compile Error and My COM Interface Is:
interface ITestOne : IDispatch
{
[id(1), helpstring("method GetBSTR1")] HRESULT GetBSTR1([out,retval]BSTR*
bstrInfo);
[propget, id(2), helpstring("property property")] HRESULT property([out,
retval] long *pVal);
[propput, id(2), helpstring("property property")] HRESULT property([in] long
newVal);
};
[object,uuid(6FFD87E9-5733-4DF2-A33A-161D44FBC7D0),dual,helpstring("ITestTwo Interface"),pointer_default(unique)]
interface ITestTwo : IUnknown
{
[id(1), helpstring("method GetBSTR2")] HRESULT GetBSTR2([out]BSTR* bufName1,
[out,retval]BSTR* bufName2);
};
[uuid(D8F2F3E6-3356-437B-849D-087CCD9439F0),version(1.0),helpstring("ATLTest 1.0 Type Library")]
library ATLTESTLib
{
importlib("stdole32.tlb");
importlib("stdole2.tlb");
[
uuid(9072075F-656A-4B1C-9809-17A6164D1507),
helpstring("TestOne Class")
]
coclass TestOne
{
[default] interface ITestOne;
};
};
|
|
|
|
|
I haven't ever learned VB before,your codes are compiled and error happened
|
|
|
|
|
Wait i will send you code for both application
send me mail at alok@efextra.com
-----------------------------
"I Think this Will Help"
-----------------------------
Alok Gupta
visit me at http://www.thisisalok.tk
|
|
|
|
|
If I recall correctly, VBScript can't handle out-only parameters.
--
Weiter, weiter, ins verderben.
Wir müssen leben bis wir sterben.
I blog too now[^]
|
|
|
|
|
thanks for your answer.Do you mean VBScript can onle receive [out retval] parameter
|
|
|
|
|
It turns out that VBScript can do [out] parameters, but only if the type of the parameter is VARIANT, as this article[^] explains.
--
Weiter, weiter, ins verderben.
Wir müssen leben bis wir sterben.
I blog too now[^]
|
|
|
|
|
|
could I say that if I build a compnent used by VBScript and other script language,the parameter should be dedined VARIANT
|
|
|
|
|