|
hello,
thankyou for replying.
there seems no difference in calling the InitModalIndirect() but when I changed the version of my project I getting debug just before when the dialog opens and the same dialog was fine in the Visul studio 6.0.
Pritha
|
|
|
|
|
prithaa wrote: when I changed the version of my project I getting debug just before when the dialog opens and the same dialog was fine in the Visul studio 6.0.
Sorry, but I am not sure what you mean by this, or what it has to do with your original question. Do you have a problem that you cannot resolve, and if so what is the code that is failing?
Just say 'NO' to evaluated arguments for diadic functions! Ash
|
|
|
|
|
thanks for replies
I made a class derived from CDialog with memery allocations for DLGTEMPLATE structure.Basically doing what was required to do for making a dialog without resources and was working fine with Visual Studio 6.But the sames classes, objects r not working with Visual Studio 2005 though I m not getting any compile time error.
So I read through the documetation of any differnece for making the dialogs but it was not helpful.
Any suggestions
|
|
|
|
|
prithaa wrote: But the sames classes, objects r not working with Visual Studio 2005
What does "not working" mean, it explains nothing; try and be more specific about the results you expect and what you see. Are you sure that all your dialog items are correctly aligned to WORD or DWORD boundaries, as required?
Just say 'NO' to evaluated arguments for diadic functions! Ash
|
|
|
|
|
thanks I will check with that.
But not working means I am getting Debug Assertion failure for DoModal() function.
Can u please clear
Are you sure that all your dialog items are correctly aligned to WORD or DWORD boundaries, as required?
Pritha
|
|
|
|
|
prithaa wrote: I am getting Debug Assertion failure for DoModal() function.
Well that should give you a clue; look at the details of the assertion and try to figure out why it is getting thrown, and which parameter in your dialog may be causing the problem.
prithaa wrote: Can u please clear ...
I mean, check the positioning of all your dialog items in memory to ensure that they are correctly aligned, before you call DoModal() ; for further information see here[^].
Just say 'NO' to evaluated arguments for diadic functions! Ash
|
|
|
|
|
|
So does this solve the problem?
Just say 'NO' to evaluated arguments for diadic functions! Ash
|
|
|
|
|
No but then I got a few guidelines towards the solutions.
can i paste my code hear .It is about memory allocation and then calling InitModalIndirect
Pritha
|
|
|
|
|
prithaa wrote: can i paste my code hear
Sure, if you think it will be useful for others.
Just say 'NO' to evaluated arguments for diadic functions! Ash
|
|
|
|
|
int MFC::Dialog::DoModal()
{
int cWC = MultiByteToWideChar(CP_ACP, 0, m_strCaption, -1, NULL, 0);
int szBoxLen = cWC + 1;
WCHAR *szBoxCaption = new WCHAR[szBoxLen];
// Copy the string...
MultiByteToWideChar(CP_ACP, 0, m_strCaption, -1, (LPWSTR) szBoxCaption, cWC);
szBoxCaption[cWC] = 0;
szBoxLen = (cWC) * sizeof(WCHAR);
int nBufferSize = sizeof(DLGTEMPLATE) + (2 * sizeof(WORD)) /*menu and class + szBoxLen /*size of caption*/
+ sizeof(WORD) /*fontsize*/ ;//+ nFontNameLen /*size of fontname*/;
HLOCAL hLocal = LocalAlloc(LHND, nBufferSize);
if (hLocal != NULL) {
BYTE* pBuffer = (BYTE*)LocalLock(hLocal);
if (pBuffer == NULL) {
LocalFree(hLocal);
AfxMessageBox(_T("D::DoModal() : LocalLock Failed"));
}
BYTE *pdest = pBuffer;
// transfer DLGTEMPLATE structure to the buffer
memcpy(pdest, &m_DialogTemplate, sizeof(DLGTEMPLATE)); // DLGTemplate
pdest += sizeof(DLGTEMPLATE);
*(WORD*)pdest = 0;// no menu -- WORD to say it is 0 bytes
pdest += sizeof(WORD); // Increment
*(WORD*)(pdest + 1) = 0; // use default window class -- WORD to say it is 0 bytes
pdest += sizeof(WORD); // Increment
memcpy(pdest, szBoxCaption, szBoxLen); // Caption
pdest += szBoxLen;
//These are the MFC functions, which do the job...
InitModalIndirect((LPDLGTEMPLATE)pBuffer, m_pParentWnd);
int iRet =0;
iRet = CDialog::DoModal();
LocalUnlock(hLocal);
LocalFree(hLocal);
return 0;
}
else {
AfxMessageBox(_T("D::DoModal() : LocalAllock Failed"));
return -1;
}
}
|
|
|
|
|
Please could you put <pre></pre> tags around your code so that it is readable (just edit your message and use the code block button). Also use the Preview button before you post to make sure it is all formatted correctly. Your code looks like:
int MFC::Dialog::DoModal()
{
int cWC = MultiByteToWideChar(CP_ACP, 0, m_strCaption, -1, NULL, 0);
int szBoxLen = cWC + 1;
WCHAR *szBoxCaption = new WCHAR[szBoxLen];
// ...
it should look like:
int MFC::Dialog::DoModal()
{
int cWC = MultiByteToWideChar(CP_ACP, 0, m_strCaption, -1, NULL, 0);
int szBoxLen = cWC + 1;
WCHAR *szBoxCaption = new WCHAR[szBoxLen];
Just say 'NO' to evaluated arguments for diadic functions! Ash
|
|
|
|
|
DLGTEMPLATE m_DialogTemplate;
int MFC::Dialog::DoModal()
{
//For OK and Cancel buttons??
m_DialogTemplate.cy+=(DlgControls.size()*4);
AddOkCancel();
int iRet=0;
//presetting for caption in the dialog....
int cWC = MultiByteToWideChar(CP_ACP, 0, m_strCaption, -1, NULL,0);
int szBoxLen = cWC + 1;
WCHAR *szBoxCaption = new WCHAR[szBoxLen];
// Copy the string...
MultiByteToWideChar(CP_ACP, 0, m_strCaption, -1, (LPWSTR)szBoxCaption, cWC);
szBoxCaption[cWC] = 0;
szBoxLen = (cWC) * sizeof(WCHAR);
int nBufferSize = sizeof(DLGTEMPLATE) + (2 * sizeof(WORD)) /*menu and class*/ + szBoxLen /*size of caption*/
+ sizeof(WORD) /*fontsize*/ ;//+ nFontNameLen /*size of fontname*/;
HLOCAL hLocal = LocalAlloc(LHND, nBufferSize);
if (hLocal != NULL) {
BYTE* pBuffer = (BYTE*)LocalLock(hLocal);
if (pBuffer == NULL) {
LocalFree(hLocal);
AfxMessageBox(_T("D::DoModal() : LocalLock Failed"));
}
BYTE *pdest = pBuffer;
// transfer DLGTEMPLATE structure to the buffer
memcpy(pdest, &m_DialogTemplate, sizeof(DLGTEMPLATE)); // DLGTemplate
pdest += sizeof(DLGTEMPLATE);
*(WORD*)pdest = 0; // no menu -- WORD to say it is 0 bytes
pdest += sizeof(WORD); // Increment
*(WORD*)(pdest + 1) = 0; // use default window class -- WORD to say it is 0 bytes
pdest += sizeof(WORD); // Increment
memcpy(pdest, szBoxCaption, szBoxLen);
// Caption
pdest += szBoxLen;
//These are the MFC functions, which do the job...
InitModalIndirect((LPDLGTEMPLATE)pBuffer, m_pParentWnd);
iRet = CDialog::DoModal();
LocalUnlock(hLocal);
LocalFree(hLocal);
return iRet;
}
else {
AfxMessageBox(_T("D::DoModal() : LocalAllock Failed"));
return -1;
}
}
|
|
|
|
|
Well I guess you missed most of my message where I said:
1. Edit your message, i.e. the one where you posted the code.
2. Use <pre></pre> tags around your code.
3. Use the Preview button to check that what you have posted is correct.
Just say 'NO' to evaluated arguments for diadic functions! Ash
|
|
|
|
|
sorry i m posting code for the first time
int MFC::Dialog::DoModal()
{
m_DialogTemplate.cy+=(DlgControls.size()*4);
AddOkCancel();
int iRet=0;
int cWC = MultiByteToWideChar(CP_ACP, 0, m_strCaption, -1, NULL, 0);
int szBoxLen = cWC + 1;
WCHAR *szBoxCaption = new WCHAR[szBoxLen];
MultiByteToWideChar(CP_ACP, 0, m_strCaption, -1, (LPWSTR) szBoxCaption, cWC);
szBoxCaption[cWC] = 0;
szBoxLen = (cWC) * sizeof(WCHAR);
int nBufferSize = sizeof(DLGTEMPLATE) + (2 * sizeof(WORD)) + szBoxLen
+ sizeof(WORD) ;
HLOCAL hLocal = LocalAlloc(LHND, nBufferSize);
if (hLocal != NULL) {
BYTE* pBuffer = (BYTE*)LocalLock(hLocal);
if (pBuffer == NULL) {
LocalFree(hLocal);
AfxMessageBox(_T("D::DoModal() : LocalLock Failed"));
}
BYTE *pdest = pBuffer;
memcpy(pdest, &m_DialogTemplate, sizeof(DLGTEMPLATE));
pdest += sizeof(DLGTEMPLATE);
*(WORD*)pdest = 0;
pdest += sizeof(WORD);
*(WORD*)(pdest + 1) = 0;
pdest += sizeof(WORD);
memcpy(pdest, szBoxCaption, szBoxLen);
pdest += szBoxLen;
InitModalIndirect((LPDLGTEMPLATE)pBuffer, m_pParentWnd);
iRet = CDialog::DoModal();
LocalUnlock(hLocal);
LocalFree(hLocal);
return iRet;
}
else {
AfxMessageBox(_T("D::DoModal() : LocalAllock Failed"));
return -1;
}
}
|
|
|
|
|
|
I am programming a model for Process state simulation
In my model the program logic is similar to logic gates. The state of different boolean variables changes from 1 to 0 or vice versa.
Eg: The value of A, B, C and other variables changes from 0 to 1 and viceversa depending on some calculation and behaviour of the model.
There are some dependant variables X, Y, Z and other variables whose state changes accordingly the same depending on A, B and C. The dependant variables should not change immediately but with a delay that is set by the user.
My requirement is I need a function where if I call the function by passing the variable name, dependant variable name and the time delay so that the dependant variable changes according to the variable only after the set time delay. The function call should not disturb or create time delay in the model. It should only create a delay after which the dependant variable is assigned with the value.
Kindly help.
Thanks,
Mohan
|
|
|
|
|
It really depends on your program architecture. One solution which comes to my mind is to use timers, but I'm not sure if this is appropriate in your case. You said that your model similar to logic gates. Do you mean that you have some kind of "blocks" which are connected together and executed in a cycle ? If yes, then I would use another approach: as the blocks are executed at each cycle, the block can evaluate wether the timer for a certain variable has expired. This is, in my opinion, a cleaner solution that using timers.
|
|
|
|
|
Take it :
#define TICK_EXPIRED(dwActTick, dwToTick) ((long)(dwToTick - dwActTick) <= 0)
#define TICK_ELAPSED(dwTime) TICK_EXPIRED(GetTickCount(), dwTime)
template <typename T>
class DelaySetVar
{
CCriticalSection m_cLocalLock;
T m_value;
CCriticalSection m_cMapLock;
volatile bool m_bPleaseExitNow;
CMap<DWORD,DWORD,DWORD,DWORD> m_mapLiveThreads;
class SetThreadParam
{
friend class DelaySetVar;
DelaySetVar* m_pcVarObject;
const T m_SetValue;
DWORD m_dwDelay;
public:
SetThreadParam(DelaySetVar* pcVarObject,
const T& set_value,
DWORD dwMsDelay)
: m_pcVarObject(pcVarObject),
m_SetValue(set_value),
m_dwDelay(dwMsDelay) {};
};
static UINT AFX_CDECL ValueSetProc(void* pParam)
{
SetThreadParam* pSetParam = (SetThreadParam*) pParam;
if (pSetParam) {
DWORD dwTimeOut = GetTickCount() + pSetParam->m_dwDelay;
while (!pSetParam->m_pcVarObject->m_bPleaseExitNow) {
if (TICK_ELAPSED(dwTimeOut)) {
CSingleLock cLock(&pSetParam->m_pcVarObject->m_cLocalLock, TRUE);
pSetParam->m_pcVarObject->m_value = pSetParam->m_SetValue;
break;
}
Sleep(1);
}
pSetParam->m_pcVarObject->ThreadEndEvent(GetCurrentThreadId());
delete pSetParam;
}
return 0;
};
void ThreadBegEvent(DWORD dwThreadID)
{
CSingleLock cLock(&m_cMapLock, TRUE);
m_mapLiveThreads.SetAt(dwThreadID, dwThreadID);
};
void ThreadEndEvent(DWORD dwThreadID)
{
CSingleLock cLock(&m_cMapLock, TRUE);
m_mapLiveThreads.RemoveKey(dwThreadID);
};
public:
DelaySetVar()
: m_value(),
m_bPleaseExitNow(false) {};
DelaySetVar(const T& init)
: m_value(init),
m_bPleaseExitNow(false) {};
~DelaySetVar()
{
m_bPleaseExitNow = true;
while (true) {
{
CSingleLock cLock(&m_cMapLock, TRUE);
if (!m_mapLiveThreads.GetCount()) {
break;
}
}
Sleep(1);
}
}
const T& GetValue() {
CSingleLock cLock(&m_cLocalLock, TRUE);
return m_value;
};
void SetValue(const T& set_value, DWORD dwMsDelay = 0)
{
if (!m_bPleaseExitNow) {
if (dwMsDelay) {
CWinThread* pcThread = ::AfxBeginThread(ValueSetProc,
new SetThreadParam(this,
set_value,
dwMsDelay),
0, CREATE_SUSPENDED);
if (pcThread) {
pcThread->m_bAutoDelete = true;
ThreadBegEvent(pcThread->m_nThreadID);
pcThread->ResumeThread();
}
} else {
CSingleLock cLock(&m_cLocalLock, TRUE);
m_value = set_value;
}
}
};
}; Possible usage :
{
DelaySetVar<int> iVar(3);
iVar.SetValue(2, 2000);
do {
cout << iVar.GetValue() << '\n';
} while (3 == iVar.GetValue());
cout << iVar.GetValue() << '\n';
iVar.SetValue(3);
cout << iVar.GetValue() << '\n';
iVar.SetValue(4, 2000);
}
Of course, the used T must support operator=
They sought it with thimbles, they sought it with care;
They pursued it with forks and hope;
They threatened its life with a railway-share;
They charmed it with smiles and soap.
modified on Thursday, September 30, 2010 6:00 AM
|
|
|
|
|
You could try a time sorted queue of events - when you want to model a propagation delay you bung the operation into the queue and each loop around your main timing loop you can pull any relevant events off the queue and apply them. You could even use this as the basis of propagating your signals around the system being simulated to keep things clean and not have two mechanisms for transmitting state changes from subsystem to subsystem.
Cheers,
Ash
|
|
|
|
|
yes, that is the normal approach in simulation.
|
|
|
|
|
All the games I've worked on (that actually worked nicely instead of just being lashed up piles of rubbish) used it as well.
Cheers,
Ash
|
|
|
|
|
Hi All,
How to call C# APIs from C++ code. Is there any proxy/stubs comes into picture.
|
|
|
|
|
You need to expose it as COM and then as how you invoke the COM component from C++, you have to call that component. Framework creates CCW wrapper for you which makes COM call from C++ to C# easier.
Thanks,
Anand.
|
|
|
|
|
If you mean "using the .NET Framework classes in a C++ application", the answer is C++/CLI
|
|
|
|
|