|
Very strange situation for me:
I developed a console application,
to implement an NT Service. The service interact with desktop, to make settings changes, thru succesive dialogs.
Because I need to display a table content, I use MSFlexGrid in one of the dialogs. The problem is that the dialog with this control isn't displayed.
I try to make all necessary aditions to may application, to support MFC (as I say, is a console app.) - and it work, I also call
"AfxEnableControlContainer();" (????? I thinked I need this), but the dialog with control is still not displayed. Trying some work in debugger, show me that "OnInitDialog()" is never reached.
Really, I could not figure the right way to make
my application support ActiveX controls.
Does anybody know something about this problem?
Thanks in advance.
|
|
|
|
|
I am not really sure about this, but sometimes calling InitCommonControlsEx does help.
Nish
It's seven o'clock
On the dot
I'm in my drop top
Cruisin' the streets - Oh yeah
I got a real pretty, pretty little thing that's waiting for me
|
|
|
|
|
If you are running a console app, you cannot use Windows. (kind of by definition) If you want dialogs (or any other window for that matter) you need a windows app.
You can probably turn your console app into a windows app with enough work, but its much easier with one of the MS frameworks.
Hope this helps,
Bill
|
|
|
|
|
I agree with Will. (A console can not display a dialog)
But for show a dialog you must to set the type of service like SERVICE_INTERACTIVE_PROCESS....
For the first point, I remember that a guy published a article that displayed a dialog from a console application....
Best Regards....
Carlos Antollini.
Sonork ID 100.10529 cantollini
|
|
|
|
|
Thanks,
Really my problem was with OLE initialization.
As I said, the service interact ok with desktop,
and all MFC / GUI stuff work well. The single problem
occur when I'm using MSFlexGrid (ActiveX) in one of
my dialogs.
I feel that is something related to OLE support and initialization,
but I don't know exactly how to do this,
in proper way.
|
|
|
|
|
Did you try calling InitCommonControlsEx()?
Nish
It's seven o'clock
On the dot
I'm in my drop top
Cruisin' the streets - Oh yeah
I got a real pretty, pretty little thing that's waiting for me
|
|
|
|
|
Yes, I tryed it.
It doesn't seems to help with ActiveX controls...
Thanks.
|
|
|
|
|
Add AfxOleInit in your initInstance...;)
Best Regards
Carlos Antollini.
Sonork ID 100.10529 cantollini
|
|
|
|
|
Carlos Antollini wrote:
AfxOleInit
Many thanks!! This is the solution, and work excellent.
I just put it before the point I need it.
Great tip!
Regards.
|
|
|
|
|
The following is my code:
void CFilerecvDlg::OnStartServer()
{
m_button.EnableWindow(false);
CString s_name;
UINT port;
try {
g_sListen.Create(0);
g_sListen.GetSockName(s_name, port);
g_sListen.Bind(port);
g_sListen.Listen();
AfxBeginThread(ServerThreadProc, GetSafeHwnd());
}
catch(CException* e) {
e->Delete();
}
}
UINT ServerThreadProc(LPVOID pParam)
{
CSocket sConnect;
g_sListen.Accept(sConnect);
TRACE ("\nSocket connetced\n");
sConnect.Detach();
sConnect.Close();
return 0;
}
The run fails... A message is issued tellin something like "Thread 0x5425.. has exited with code -1. Memory leak detected!...". g_sListen is a global CSocket variable (in my serverdlg.cpp file). There are no warnings or errors at compile time...
Can anyone tell me where is my mistake???
"Needless redundancy is the hobgoblin of software engineering." - Peter Darnell
|
|
|
|
|
Vladimir Georgiev wrote:
sConnect.Detach();
sConnect.Close();
When you detach, the underlying SOCKET is detached from your CSocket object and it's m_hSocket is cleared. This itself is a leak of sorts as you dont seem to be closesocket()-ing the detached SOCKET anywhere.
Nish
It's seven o'clock
On the dot
I'm in my drop top
Cruisin' the streets - Oh yeah
I got a real pretty, pretty little thing that's waiting for me
|
|
|
|
|
UINT ServerThreadProc(LPVOID pParam)
{
CSocket sConnect;
g_sListen.Accept(sConnect);
TRACE ("\nSocket acepted\n");
sConnect.Close();
return 0;
}
there is no TRACE in the debugger also after executing with this piece of code...
"Needless redundancy is the hobgoblin of software engineering." - Peter Darnell
|
|
|
|
|
Vladimir
You are not doing this the right way at all.
You are calling GetSockName() on an unconnected socket. That will result in weird results. I suggest that you seriously take up a book and just browse through the basic. It should take you only 10-20 mins to get adjusted to it.
And one piece of advice :- The MFC socket classes are not thread-safe and you can run into all sorts of trouble using them. As far as possible use the native Winsock API.
Nish
It's seven o'clock
On the dot
I'm in my drop top
Cruisin' the streets - Oh yeah
I got a real pretty, pretty little thing that's waiting for me
|
|
|
|
|
Nish [BusterBoy] wrote:
And one piece of advice :- The MFC socket classes are not thread-safe and you can run into all sorts of trouble using them. As far as possible use the native Winsock API.
This is sort of true, sort of not true. The MFX Socket classes don't work very well multi threaded. But they do work.
However, looks to me like you'd be far better off staying single threaded, but using CAsyncSocket.
Sorry to dissapoint you all with my lack of a witty or poignant signature.
|
|
|
|
|
All the traces lead to this piece of code:
// The same socket better not be blocking in more than one place.
ASSERT(m_pbBlocking == NULL);
_AFX_SOCK_THREAD_STATE* pState = _afxSockThreadState;
ASSERT(pState->m_hSocketWindow != NULL);
BOOL bBlocking = TRUE;
m_pbBlocking = &bBlocking;
CWinThread* pThread = AfxGetThread();
in a socketsomething.cpp
"Needless redundancy is the hobgoblin of software engineering." - Peter Darnell
|
|
|
|
|
ASSERT(pState->m_hSocketWindow != NULL);
this assertion failed... If you can think of something, please post it.
"Needless redundancy is the hobgoblin of software engineering." - Peter Darnell
|
|
|
|
|
g_sListen.Create(0);
g_sListen.GetSockName(s_name, port);
g_sListen.Bind(port);
g_sListen.Listen();
Nish
It's seven o'clock
On the dot
I'm in my drop top
Cruisin' the streets - Oh yeah
I got a real pretty, pretty little thing that's waiting for me
|
|
|
|
|
Hmm, I think the sequence here should be:
g_sListen.Create(0);
g_sListen.Bind(....);
g_sListen.GetSockName();
You can pass NULL to Bind, and let system give you the IP address of local computer as well as assign a free port number to you. Since both are assigned by the system, you want to call GetSockName to retrieve these two parameters.
|
|
|
|
|
In my dialog app i have 2 functions which use ADO connection to catch value from a database, and which put them into a "C" pointer of pointer and a regular pointer. I want after in a third function use the 2 pointers, which represent some of the input data. As i do it with 3 different button which each of them call one and only one function.
For example the first, called OnLoadCorrel, put a whole matrix into a **pCorrel, the second one called On LoadVol, put a whole array into a *pVol. And, finally, the 3 function use the values needed coming from the matrix and the array. It's at this point of my app that there's a pb, because when i call the third function, the app doesn't recognize (or know) the value into both the pointers (perhaps the value have been lost?!?)
So you could see the following lost, and i hope that soeone could find if what is wron in my app.
/////////////////////////////////////////////////////////
So, in the CalcRiskPortDlg.cpp::
void CCalcRiskPortDlg::OnLoadVol()
{
UpdateData(TRUE);
::CoInitialize(NULL);
LoadTables Table(m_dlgSector);
int i;
// _variant_t IndexCol;
CString strValue;
try
{
_ConnectionPtr pConnection=NULL;
CString strTemp;
strTemp.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\\CalcRiskPort\\vol_correl1.mdb;");
_bstr_t strCnn(strTemp);
TESTHR(pConnection.CreateInstance(__uuidof(Connection)));
pConnection->Open(strCnn,"","",adConnectUnspecified);
_RecordsetPtr pTp("ADODB.Recordset");
try
{
pTp->Open("Volatilité",strCnn,adOpenStatic,adLockOptimistic,adCmdTableDirect);
if(!pTp->EndOfFile)
{
for(i=1;i<=m_dlgSector;i++)
{
pTp->MoveFirst();
pTp->Move(i-1);
//strIndexCol=Table.ConvIntToVar((double)j);
//strIndexCol=strIndexCol+strT;
//_variant_t IndexCol(strIndexCol);
*(Table.pVol+i)=pTp->Fields->GetItem("Volatilité")->Value;
}
}
//dValue=pTp->Fields->GetItem("N° Titre")->Value;
//Parameter2=pTp->Fields->GetItem(IndexColumn)->Value;
pTp->Close();
}
catch(_com_error &e)
{
AfxMessageBox("a pas bon");
}
m_dlgValue=Table.pVol[3];
strValue.Format("%.9f",m_dlgValue);
CEdit* PEdit=(CEdit*)GetDlgItem(IDC_VALUE);
PEdit->SetWindowText(strValue);
//Table.free_dmatrix(Table.pCorrel,1,m_dlgPortWeight,1,m_dlgPortWeight);
pConnection->Close();
}
catch(_com_error &e)
{
AfxMessageBox("a pas bon");
}
::CoUninitialize();
// TODO: Add your control notification handler code here
}
void CCalcRiskPortDlg::OnLoadCorrel()
{
UpdateData(TRUE);
::CoInitialize(NULL);
LoadTables Table(1,m_dlgSector,1,m_dlgSector);
int i,j;
// _variant_t IndexCol;
CString strValue,strT,strIndexCol;
strT="t";
//Table.pCorrel=Table.dmatrix(1,m_dlgPortWeight,1,m_dlgPortWeight);
try
{
_ConnectionPtr pConnection=NULL;
CString strTemp;
strTemp.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\\CalcRiskPort\\vol_correl1.mdb;");
_bstr_t strCnn(strTemp);
TESTHR(pConnection.CreateInstance(__uuidof(Connection)));
pConnection->Open(strCnn,"","",adConnectUnspecified);
_RecordsetPtr pTp("ADODB.Recordset");
try
{
pTp->Open("Correlation",strCnn,adOpenStatic,adLockOptimistic,adCmdTableDirect);
if(!pTp->EndOfFile)
{
for(i=1;i<=m_dlgSector;i++)
{
for(j=1;j<=m_dlgSector;j++)
{
pTp->MoveFirst();
pTp->Move(i-1);
strIndexCol=Table.ConvIntToVar((double)j);
strIndexCol=strIndexCol+strT;
_variant_t IndexCol(strIndexCol);
*(*(Table.pCorrel+i)+j)=pTp->Fields->GetItem(IndexCol)->Value;
}
}
}
//dValue=pTp->Fields->GetItem("N° Titre")->Value;
//Parameter2=pTp->Fields->GetItem(IndexColumn)->Value;
pTp->Close();
}
catch(_com_error &e)
{
AfxMessageBox("a pas bon");
}
m_dlgValue=Table.pCorrel[3][7];
strValue.Format("%.9f",m_dlgValue);
CEdit* PEdit=(CEdit*)GetDlgItem(IDC_VALUE);
PEdit->SetWindowText(strValue);
//Table.free_dmatrix(Table.pCorrel,1,m_dlgPortWeight,1,m_dlgPortWeight);
pConnection->Close();
}
catch(_com_error &e)
{
AfxMessageBox("a pas bon");
}
::CoUninitialize();
// TODO: Add your control notification handler code here
}
void CCalcRiskPortDlg::OnCalcvar()
{
UpdateData(TRUE);
::CoInitialize(NULL);
LoadTables Table;
double Var;
double *pTabVar=new double[pow(2,m_dlgSector)];
CString strValue;
int *pTabBinPort=new int[m_dlgAsset];
int *pTabNumPort=new int[m_dlgAsset];
int k,i;
i=0;
for(k=0;k<=m_dlgAsset-1;k++)
{
*(pTabBinPort+k)=0;
Table.ConvertBinToNum(k,pTabBinPort,pTabNumPort);
}
*pTabVar=Table.CalcVar(pTabNumPort,m_dlgAsset);
for(i=1;i<=pow(2,m_dlgSector);i++)
{
k=m_dlgSector-1;
while(*(pTabBinPort+k)==1)
{
*(pTabBinPort+k)=0;
Table.ConvertBinToNum(k,pTabBinPort,pTabNumPort);
k--;
}
*(pTabBinPort+k)=1;
Table.ConvertBinToNum(k,pTabBinPort,pTabNumPort);
*(pTabVar+i)=Table.CalcVar(pTabNumPort,m_dlgAsset);
}
m_dlgValue=pTabVar[2];
strValue.Format("%.9f",m_dlgValue);
CEdit* PEdit=(CEdit*)GetDlgItem(IDC_VALUE);
PEdit->SetWindowText(strValue);
delete []pTabVar;
delete []pTabNumPort;
delete []pTabBinPort;
::CoUninitialize();
// TODO: Add your control notification handler code here
}
///////////////////////////////////////////////////////////
and for information the LoadTable.cpp code where you could find others function's definitions:
#include "stdafx.h"
#include "CalcRiskPort.h"
#include "LoadTables.h"
#define NR_END 1
#define FREE_ARG char*
#ifdef _DEBUG
#undef THIS_FILE
static char THIS_FILE[]=__FILE__;
#define new DEBUG_NEW
#endif
//////////////////////////////////////////////////////////////////////
// Construction/Destruction
//////////////////////////////////////////////////////////////////////
LoadTables::LoadTables()
{
}
LoadTables::LoadTables(long a,long b,long c,long d)
{
//free_dmatrix(pCorrel,a,b,c,d);
pCorrel=dmatrix(a,b,c,d);
}
LoadTables::LoadTables(long a)
{
pVol=NULL;
Delete_pVol();
pVol=new double [a];
}
void LoadTables::Delete_pVol()
{
if(pVol!=NULL)
{
delete[] pVol;
pVol=NULL;
}
}
LoadTables::~LoadTables()
{
}
void LoadTables::nrerror(char error_text[])
{
AfxMessageBox("Ca marche moyen");
exit(1);
}
double **LoadTables::dmatrix(long LowRow,long HighRow,long LowCol,long HighCol)
{
long i, RowSize=HighRow-LowRow+1,ColSize=HighCol-LowCol+1;
double **m;
m=(double **)malloc((size_t)((RowSize+NR_END)*sizeof(double*)));
if(!m)nrerror("pb allocation1 in matrix()");
m +=NR_END;
m -=LowRow;
m[LowRow]=(double *)malloc((size_t)((RowSize*ColSize+NR_END)*sizeof(double)));
if(!m[LowRow])nrerror("pb allocation2 in matrix()");
m[LowRow] +=NR_END;
m[LowRow] -=LowCol;
for(i=LowRow+1;i<=HighRow;i++)
m[i]=m[i-1]+ColSize;
return m;
}
void LoadTables::free_dmatrix(double **m,long LowRow,long HighRow,long LowCol,long HighCol)
{
free((FREE_ARG)(m[LowRow]+LowCol-NR_END));
free((FREE_ARG)(m+LowRow-NR_END));
}
CString LoadTables::ConvIntToVar(double j)
{
CString strIndexCol;
int decimal,sign;
strIndexCol=_fcvt(j,0,&decimal,&sign);
//_variant_t IndexCol(strIndexCol);
return strIndexCol;
}
double LoadTables::ReturnValue(long Row,_variant_t IndexCol, _variant_t ParamTable)
{
double dValue;
CString strTemp;
strTemp.Format("Provider=Microsoft.Jet.OLEDB.4.0;Data Source=D:\\CalcRiskPort\\vol_correl1.mdb;");
_bstr_t strcnn(strTemp);
_RecordsetPtr pTp("ADODB.Recordset");
try
{
pTp->Open(ParamTable,strcnn,adOpenStatic,adLockOptimistic,adCmdTableDirect);
pTp->MoveFirst();
pTp->Move(Row-1);
if(!pTp->EndOfFile)
dValue=pTp->Fields->GetItem(IndexCol)->Value;
//dValue=pTp->Fields->GetItem("N° Titre")->Value;
//Parameter2=pTp->Fields->GetItem(IndexColumn)->Value;
pTp->Close();
}
catch(_com_error &e)
{
AfxMessageBox("Table non atteinte");
pTp->Close();
}
return dValue;
}
double LoadTables::CalcVar(int* pTabNumPort,int NbOfAsset)
{
int i,j;
double sum1,sum2,sum;
sum=sum1=sum2=0;
for(i=1,j=0;i<=NbOfAsset,j
|
|
|
|
|
Hi,
I want to create a Winpopup type in VC Dialog Based one.
How to send a message from one system to anothere system.
Regards,
Mani.
|
|
|
|
|
Does anyone know of a way to guard a delete operator from trying to release a non-allocated block, as in the following trivial example.
short x[ 100 ];
try
{
delete []x;
}
catch( ... )
{
return MDERROR;
}
This does not work as the exception is caught somewhere in the bowels of the system and I get either an assert or a user breakpoint box. I have looked at RTTI but it doesn't help me. How can I prevent a crash if I'm passed a pointer to a global or static block?
Thanks all!
|
|
|
|
|
This function determines whether a given pointer belongs in the stack or not:
bool is_stack_memory(void * p)
{
char check;
MEMORY_BASIC_INFORMATION m1,m2;
::ZeroMemory(&m1,sizeof(m1));
::ZeroMemory(&m2,sizeof(m2));
::VirtualQuery(p,&m1,sizeof(m1));
::VirtualQuery(&check,&m2,sizeof(m2));
return m1.BaseAddress==m2.BaseAddress;
} So you can write code like
if(is_stack_memory(x)){
printf("x has not been dynamically allocated\n");
return MDERROR;
}
else{
delete [] x;
} Anyway, IMHO designing functions around this feature is not a very good idea. I'd restrict the ability to determine whether a pointer is delete able to doing error checking in debug mode.
Joaquín M López Muñoz
Telefónica, Investigación y Desarrollo
PS: There's a limitation in is_stack_memory , namely that it fails to identify pointers on other threads' stacks. This could be worked around, however.
|
|
|
|
|
or, if you ALWAYS init pointers to NULL, and ALWAYS reset them to NULL after delete, like I do, then:
if (pointer)
delete [] pointer;
pointer = NULL;
Sorry to dissapoint you all with my lack of a witty or poignant signature.
|
|
|
|
|
If I were you, I would review my design. By this I mean that an object shouldn't deallocate memory it didn't allocate (which is obviously the case here since your object can't figure out if it is stack or heap memory), unless you have a good reason.
If I am wrong or said something stupid, I apologize in advance
Michel
|
|
|
|
|
Thanks for your thoughts. I didn't design or write this stuff. I'm only trying to wrap an audio interface I got pre-cooked. I watch my own new's and delete's like a hawk and always have the leakage detector on.
The bit about nulling the pointer is very good (simple and obvious) and will be standard in my code from now on.
I do however find it strange that delete doesn't throw a catchable exception. There must be a good reason for it. I will try it on Linux and see if it tells me why.
|
|
|
|
|