|
In addition to David Crow's comments -
you CAN step into MFC source code and put breakpoints in it
(just in case you didn't know )
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
I found a problem:
Please consider the following code fragment:
<br />
CSingleDocTemplate* pDocTemplate;<br />
pDocTemplate = new CSingleDocTemplate (<br />
IDR_MAINFRAME,<br />
RUNTIME_CLASS (CDocument),<br />
RUNTIME_CLASS (MyWindow),<br />
RUNTIME_CLASS (MyView)<br />
);<br />
AddDocTemplate (pDocTemplate);<br />
RegisterShellFileTypes (TRUE);<br />
It should have been:
<br />
CSingleDocTemplate* pDocTemplate;<br />
pDocTemplate = new CSingleDocTemplate (<br />
IDR_MAINFRAME,<br />
RUNTIME_CLASS (MyDocument),<br />
RUNTIME_CLASS (MyWindow),<br />
RUNTIME_CLASS (MyView)<br />
);<br />
AddDocTemplate (pDocTemplate);<br />
RegisterShellFileTypes (TRUE);<br />
After making this change, the code bombs out later. Any other ideas?
Thanks
Bob
|
|
|
|
|
...and the reason for it not working was due to fact that MFC CDocument class has Runtime class information because it is declared using DECLARE_DYNAMIC whereas your MyDocument class actually has functionality to allow dynamic creation of objects using CRuntimeClass because of DECLARE_DYNCREATE/IMPLEMENT_DYNCREATE.
So where does it break now?
Sohail
modified 21-Apr-21 21:01pm.
|
|
|
|
|
It now dies inside the following MFC routine:
<br />
void CSingleDocTemplate::SetDefaultTitle(CDocument* pDocument)<br />
{<br />
CString strDocName;<br />
if (!GetDocString(strDocName, CDocTemplate::docName) ||<br />
strDocName.IsEmpty())<br />
{<br />
ENSURE(strDocName.LoadString(AFX_IDS_UNTITLED));<br />
}<br />
pDocument->SetTitle(strDocName);<br />
}<br />
In particular, with the call to ENSURE. Here is the call stack when it dies:
> sdi1.exe!CSingleDocTemplate::SetDefaultTitle(CDocument * pDocument=0x003d95e8) Line 207 C++
sdi1.exe!CSingleDocTemplate::OpenDocumentFile(const wchar_t * lpszPathName=0x00000000, int bMakeVisible=1) Line 141 C++
sdi1.exe!CDocManager::OnFileNew() Line 848 C++
sdi1.exe!CWinApp::OnFileNew() Line 22 C++
sdi1.exe!CWinApp::ProcessShellCommand(CCommandLineInfo & rCmdInfo={...}) Line 26 C++
sdi1.exe!MainApp::InitInstance() Line 50 + 0xc bytes C++
sdi1.exe!AfxWinMain(HINSTANCE__ * hInstance=0x00400000, HINSTANCE__ * hPrevInstance=0x00000000, wchar_t * lpCmdLine=0x00020908, int nCmdShow=1) Line 37 + 0xd bytes C++
sdi1.exe!wWinMain(HINSTANCE__ * hInstance=0x00400000, HINSTANCE__ * hPrevInstance=0x00000000, wchar_t * lpCmdLine=0x00020908, int nCmdShow=1) Line 30 C++
sdi1.exe!__tmainCRTStartup() Line 263 + 0x2c bytes C
sdi1.exe!wWinMainCRTStartup() Line 182 C
kernel32.dll!7c817067()
[Frames below may be incorrect and/or missing, no symbols loaded for kernel32.dll]
I am hoping somebody here can tell me what I am doing wrong. I am finding programs using the SDI model to be very hard to write and debug.
Thanks
Bob
|
|
|
|
|
BobInNJ wrote: I am finding programs using the SDI model to be very hard to write and debug.
I would start with a wizard-generated SDI app instead of
code from a book or author. Subtle changes between MFC versions
could make that problematic - the wizard code should run right away
so you can get right to working on actual code
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Bob,
I agree with Mark. Try generating simple SDI application code using the wizard (make sure you don't select any advanced feature options in the wizard).
Let us know if you still have problem.
Sohail
modified 21-Apr-21 21:01pm.
|
|
|
|
|
Hi all,
I'm trying to refresh the content of a CDockablePane in order to update the values that appear in the panel at runtime anytime that it is necessary. But I'm don't able to find where and How I have to do this task. My code is this:
int CPropertiesWnd::OnCreate(LPCREATESTRUCT lpCreateStruct)
{
if (CDockablePane::OnCreate(lpCreateStruct) == -1)
return -1;
CRect rectDummy;
rectDummy.SetRectEmpty ();
if (!m_wndPropList.Create (WS_VISIBLE | WS_CHILD, rectDummy, this, 1))
{
TRACE0("Failed to create Properies Grid \n");
return -1;
}
m_wndPropList.EnableHeaderCtrl (FALSE);
m_wndPropList.EnableDescriptionArea ();
m_wndPropList.SetVSDotNetLook ();
CMFCPropertyGridProperty* pGroup1 = new CMFCPropertyGridProperty(_T("Visibilità Livelli"),ids);
string s = "Livello";
CGOEView d;
int level = d.GetNumberOfLevel();
for(int j=0;j<5;j++)
{
TRACE(_T("ciao"));
stringstream st;
st<<s<<j;
string stra = st.str();
CString stri (d.level[2][j].c_str());
CString str (stra.c_str());
pGroup1->AddSubItem(new CMFCPropertyGridProperty(stri, (_variant_t) true, _T("Questa è una descrizione"),j));
}
m_wndPropList.AddProperty(pGroup1);
return 0;
}
For example I will want to erase the last subitem of pgroup1 (in the part of the text pointed out by bold text) in which way I can do this at runtime?
|
|
|
|
|
Its first time I use of New Message on this forum but I think this article is helpful for you(of course I think you aware of it but for other friends that dont know about it.
Loading a DLL from memory[^].
|
|
|
|
|
Doing advertising?
If the Lord God Almighty had consulted me before embarking upon the Creation, I would have recommended something simpler.
-- Alfonso the Wise, 13th Century King of Castile.
This is going on my arrogant assumptions. You may have a superb reason why I'm completely wrong.
-- Iain Clarke
[My articles]
|
|
|
|
|
No thanks. 
|
|
|
|
|
Hamid. wrote: Its first time I use of New Message on this forum
Want a medal?
Regards,
--Perspx
"I've got my kids brainwashed: You don't use Google, and you don't use an iPod." - Steve Ballmer
"Some people have told me they don't think a fat penguin really embodies the grace of Linux, which just tells me they have never seen an angry penguin charging at them in excess of 100mph." - Linus Torvalds
|
|
|
|
|
|
I roughly read the article....One basic thing I didnt understand is, how to load a dll into the memory if it is not in the disk?
|
|
|
|
|
A common use for this technique is to load a dll that is stored as a program resource.
This allows single-file distribution of projects that use 3rd party dlls and for whom the source is not avail.
It's also used by some virii.
So, the dll almost always does exist locally on disk - just not in a single stand-alone file.
|
|
|
|
|
Hello everyone,
My question is about on one single machine, no matter how many different processes need/load a DLL, the DLL is actually load one copy into physical memory (not virtual memory) or multiple copies.
1.
Since the preferred load address of DLL may conflict, there may be DLL address reloading/address fixing, so if we debug different process to watch the address range for the same DLL, the range are different. My question is, in such address conflicting situation, OS actually use one single copy of physical memory to mapping to different virtual memory block address range in different process? Or using different physical memory blocks to hold multiple copies of the same DLL?
2.
If no address conflicting and the same DLL are all in the same address range of different processes. And OS only use one physical memory block containing the DLL to reflect the virtual memory address in different process?
thanks in advance,
George
|
|
|
|
|
|
|
Hey George, what's up, took another spin on your Wheel Of Questions did you?
led mike
|
|
|
|
|
led mike wrote: Hey George, what's up, took another spin on your Wheel Of Questions did you?

|
|
|
|
|
A dll is broken into 2 parts: code and data.
The first app that loads a dll causes the os to load the code into physical memory and set its reference count to 1. The app also gets its own copy of the dll data block. The os then creates mapping tables for the app that map the app address space to physical address space (or swap file).
Subsequent apps that load the dll cause the os to see it's already loaded and the reference count is just increased. Each of these apps gets its own copy of the dll data block. The os then creates mapping tables ...
...cmk
The idea that I can be presented with a problem, set out to logically solve it with the tools at hand, and wind up with a program that could not be legally used because someone else followed the same logical steps some years ago and filed for a patent on it is horrifying.
- John Carmack
|
|
|
|
|
cmk wrote: causes the os to
All DLL's are not created equal
link[^]
led mike
|
|
|
|
|
Quite right, however a full explanation is beyond the scope of a forum reply - as is evident by the length of the article you linked to (it's a good link, hopefully he will read it).
I figured a simplified version of what would/should happen, in an ideal situation, was sufficient [shrug].
...cmk
The idea that I can be presented with a problem, set out to logically solve it with the tools at hand, and wind up with a program that could not be legally used because someone else followed the same logical steps some years ago and filed for a patent on it is horrifying.
- John Carmack
|
|
|
|
|
cmk wrote: hopefully he will read it
Doesn't matter, even if he reads it he can't understand it. But there it is and the answer to his question none the less.
led mike
|
|
|
|
|
Thanks led mike,
It is really a good document. I read from begin to end and take notes.
My current understanding is, if DLL code is relocation, then it will consume a duplicate copy in memory, or else share a common copy in memory. Correct?
regards,
George
|
|
|
|
|
George_George wrote: Correct?
What? People have written pages and pages of text, and who knows how much code, to account for one simple if condition that you explained in a single sentence. Whatever dude.
led mike
|
|
|
|