|
Hi,
When you push the X button in an app, some messages are send to your app. One of those messages is the WM_DESTROY message, which doesn't get send when you push the Exit button in your dialog.
One solution is (only when it is a modal dialog) to use the OnOK (or OnCancel) message handler. This will terminate the dialog and return the DoModal funtion will return a value.
Hope this helps.
A student knows little about a lot.
A professor knows a lot about little.
I know everything about nothing.
|
|
|
|
|
LRESULT ParentDlg::OnExitApp(WPARAM wParam, LPARAM lParam){
OnClose();
return 0;
}
Is why.
Change it to
LRESULT ParentDlg::OnExitApp(WPARAM wParam, LPARAM lParam){
SendMessage(WM_CLOSE);
return 0;
}
When CDialog::OnClose gets called, it calls MFC's Default() method - which says hay what was the last message? Lets pass that to DefWindowProc for processing. If you just _call_ OnClose, the last message will be your custom message you are using to close the dialog - and DefWindowProc will do nowt.
Better yet - do away with your custom message and just send the dialog a WM_CLOSE from the other dialog.
|
|
|
|
|
J.B. wrote:
I run in debug mode and found that, if the application is to close by clicking on the "X" of the application, fair enough, OnClose() is called and it goes to OnDestroy() and the program exits (with return code code 2 (0x2) -- strange??).
Not strange at all. This is the expected return value when the "X" is clicked. If this is a modal dialog, look at the EndDialog() function. It gets called whenever a modal dialog is dismissed. Alt+F4, Cancel, and the "X" all effectively call EndDialog(2) . This value, in turn, gets passed back through DoModal() . Had you dismissed the dialog using the OK button, EndDialog(1) would have been called instead.
"When I was born I was so surprised that I didn't talk for a year and a half." - Gracie Allen
|
|
|
|
|
Thanks alot guys,
it all makes sense now
|
|
|
|
|
Has anybody goten the free 2003 compiler to work in VC++6
If so how did you do it
Thanks
|
|
|
|
|
How come no one ever ansewers ?'s about .net
i think yall are sissies
|
|
|
|
|
Anonymous wrote:
Has anybody goten the free 2003 compiler to work in VC++6
Yes.
Anonymous wrote:
If so how did you do it
Set the path to executables in the VC++ Options to specify the path to the VC++ 2003 compiler before the VC++6 compiler.
Ryan "Punctuality is only a virtue for those who aren't smart enough to think of good excuses for being late" John Nichol "Point Of Impact"
|
|
|
|
|
But thing that compile fine with 6 bring up numerous
errors when compiled with the new .net
why
|
|
|
|
|
Because VC.NET is much more standards-compliant than VC6. Some things that VC6 allowed are now errors.
Ryan "Punctuality is only a virtue for those who aren't smart enough to think of good excuses for being late" John Nichol "Point Of Impact"
|
|
|
|
|
Ryan, what kinds of projects are you using it with?
I'm working on a fairly complex library, but with no UI or Windows calls.. and I'nm finding that the libs I need are not there.
|
|
|
|
|
I only used it once. I didn't have any problems with the libraries (it was a MFC based application with DirectX etc. as well), but the VC6 debugger couldn't interpret the debugging information it put in the executable, so I canned it pretty quickly.
Ryan "Punctuality is only a virtue for those who aren't smart enough to think of good excuses for being late" John Nichol "Point Of Impact"
|
|
|
|
|
Ooh - strike three, it's out!
Thanks.
|
|
|
|
|
Hey,
I am trying to get text from a combo box in a different dialog, and how I did it I get an error.
Here is how I did it.
<br />
CDialog1::m_minCHO.GetWindowText(sText196);<br />
CDialog1 is the class, and the m_minCHO is the control combo box variable.
Here is the error
C:\DEP\DEPDlg.cpp(18122) : error C2228: left of '.GetWindowTextA' must have class/struct/union type
Any help would be great thanks
|
|
|
|
|
CDialog1 is the name of the dialog class. To call a method of that class, you must have a variable of that class available.
Software Zen: delete this;
|
|
|
|
|
Is the different dialog, a dialog of a different application?
If it isnt so, does this help?
CWnd::GetDlgItemText<br />
int GetDlgItemText( int nID, LPTSTR lpStr, int nMaxCount ) const;<br />
int GetDlgItemText( int nID, CString& rString ) const;
...Avenger
Remember... testing & debugging are always part of programming ...so exterminate those stinking bugs
|
|
|
|
|
When Compiling I get these errors.
Something to do with the Linking process??
--------------------Configuration: List - Win32 Debug--------------------
Compiling resources...
Compiling...
StdAfx.cpp
Compiling...
List.cpp
ListDlg.cpp
Generating Code...
Linking...
LINK : warning LNK4224: /PDBTYPE is no longer supported; ignored
List.obj : error LNK2001: unresolved external symbol __RTC_Shutdown
ListDlg.obj : error LNK2001: unresolved external symbol __RTC_Shutdown
List.obj : error LNK2001: unresolved external symbol __RTC_InitBase
ListDlg.obj : error LNK2001: unresolved external symbol __RTC_InitBase
List.obj : error LNK2019: unresolved external symbol __RTC_CheckEsp referenced in function "public: __thiscall CListApp::CListApp(void)" (??0CListApp@@QAE@XZ)
ListDlg.obj : error LNK2019: unresolved external symbol __RTC_CheckEsp referenced in function "public: virtual void * __thiscall CAboutDlg::`scalar deleting destructor'(unsigned int)" (??_GCAboutDlg@@UAEPAXI@Z)
List.obj : error LNK2019: unresolved external symbol @_RTC_CheckStackVars@8 referenced in function "public: virtual int __thiscall CListApp::InitInstance(void)" (?InitInstance@CListApp@@UAEHXZ)
ListDlg.obj : error LNK2001: unresolved external symbol @_RTC_CheckStackVars@8
Debug/List.exe : fatal error LNK1120: 4 unresolved externals
Error executing link.exe.
List.exe - 9 error(s), 1 warning(s)
Any Help
Thanks
-Mark
|
|
|
|
|
You need to include the library files for those functions.
like so:
#pragma comment(lib, "something.lib") //use what ever library file you need
|
|
|
|
|
Could you explain in a little more detail please
|
|
|
|
|
Ok... so first off you need to find what Library file contains those functions. I recommend google. Search for the unresolved external symbols you are having trouble with. I have to ask, what exactly is this program trying to do. I assume this is an MFC project so go try to find the libraries that MFC includes.
If this was no help then you might need to ask a professional. Like Michael Dunn
|
|
|
|
|
|
What I am trying to do is extract a file from a resource then write it into the system directory of windows. It compiles but it doesn't run correctly. I defined 1001 in resource.h and I included it also. I need help with this code here:
#include <windows.h>
#include "resource.h"
void main(void) {
char szFile[MAX_PATH];
char sysdir[MAX_PATH];
DWORD Size;
DWORD Written;
HINSTANCE hMod = GetModuleHandle(NULL);
HRSRC hRes = FindResource(hMod, MAKEINTRESOURCE(1001), RT_RCDATA);
Size = SizeofResource(hMod, hRes);
HGLOBAL hLoad = LoadResource(hMod, hRes);
LPVOID lpResLock = LockResource(hLoad);
GetSystemDirectory(sysdir, sizeof(sysdir));
strcat(sysdir, "\\abcdef.exe");
strcpy(szFile, sysdir);
HANDLE hMake = CreateFile(szFile, GENERIC_WRITE, 0, NULL, CREATE_ALWAYS, NULL | FILE_ATTRIBUTE_READONLY | FILE_ATTRIBUTE_SYSTEM, NULL);
if (hMake != INVALID_HANDLE_VALUE) {
WriteFile(hMake, lpResLock, Size, &Written, NULL);
CloseHandle(hMake);
UnlockResource(hLoad);
FreeResource(hLoad);
}
}
If anybody has code similar to this that works please post it.
|
|
|
|
|
So where exactly are you facing problem in this code?
How are you going to know where the error occured as:
- Your code never calls GetLastError() to find out if a call to WIN32 Resource API succeeded or not.
- FindResource() , LockResource() and LoadResource() returns NULL in case of an error, you are not even performing any checks for that condition too.
- Are you sure the call to CreateFile() is succeeding, try using GetLastError() to know why it failed.
- You are not comparing the value of variable Written with the variable Size to know exactly if a call to WriteFile() succeeded or not.
Points regarding your code:
1. Please move UnlockResource() out of the if block.
2. It is not necessary for Win32-based applications to FreeResource . A resource is automatically freed when its module is unloaded.
Gurmeet BTW, can Google help me search my lost pajamas?
My Articles: HTML Reader C++ Class Library, Numeric Edit Control
|
|
|
|
|
Here is a function that i wrote a while back that does work
BOOL ExtractResource(const HINSTANCE hInstance, const WORD nID, LPCTSTR szFilename)
{
BOOL bSuccess = FALSE;
HRSRC hResource = NULL;
if((hResource = ::FindResource(hInstance, MAKEINTRESOURCE(nID), _T("BINARY"))) != NULL)
{
HGLOBAL hFileResource = NULL;
if((hFileResource = ::LoadResource(hInstance, hResource)) != NULL)
{
LPVOID lpFile = NULL;
if((lpFile = ::LockResource(hFileResource)) != NULL)
{
DWORD dwSize = ::SizeofResource(hInstance, hResource);
if(dwSize > 0)
{
HANDLE hFile = INVALID_HANDLE_VALUE;
if((hFile = ::CreateFile(szFilename, GENERIC_READ|GENERIC_WRITE, 0,
NULL, CREATE_ALWAYS, FILE_ATTRIBUTE_NORMAL, NULL)) != INVALID_HANDLE_VALUE)
{
HANDLE hFilemap = NULL;
if((hFilemap = ::CreateFileMapping(hFile, NULL, PAGE_READWRITE, 0, dwSize, NULL)) != NULL)
{
LPVOID lpBaseAddress = NULL;
if((lpBaseAddress = MapViewOfFile(hFilemap, FILE_MAP_WRITE, 0, 0, 0)) != NULL)
{
::CopyMemory(lpBaseAddress, lpFile, dwSize);
bSuccess = TRUE;
::UnmapViewOfFile(lpBaseAddress);
}
::CloseHandle(hFilemap);
}
::CloseHandle(hFile);
}
}
}
}
}
}
return bSuccess;
}
Call it like:
ExtractResource(::AfxGetInstanceHandle (), 1001, "C:\\Whatever");
You then put your files into you RC file like this:
1001 BINARY MOVEABLE PURE "C:\\WhatEverFile"
|
|
|
|
|
Here is how I have done it in an MFC application:
In the .rc2 file, include the file you want to extract
ResourceName ResourceType "ResourceFilename"
To extract it:
ExtractFile("ResourceName", "ResourceType", pathname);
bool ExtractFile(const CString& resourceID, const CString& resourceType, const CString& filename)
{
bool bOK = true;
HANDLE hRes = ::LoadResource(hInstance, ::FindResource(hInstance, resourceID, resourceType));
if (hRes != INVALID_HANDLE_VALUE)
{
DWORD sizeOfResource = ::SizeofResource(hInstance, ::FindResource(hInstance, resourceID, resourceType));
char *lpRes = (char*)::LockResource(hRes);
CFile file;
if (file.Open(filename, CFile::modeCreate | CFile::modeWrite))
{
file.WriteHuge(lpRes, sizeOfResource);
file.Close();
}
else
{
bOK = false;
}
::UnlockResource(hRes);
::FreeResource(hRes);
}
return bOK;
}
Roger Allen - Sonork 100.10016
Strong Sad: I am sad I am flying
Who is your favorite Strong?
|
|
|
|
|
See if this article is of any help.
"When I was born I was so surprised that I didn't talk for a year and a half." - Gracie Allen
|
|
|
|
|