|
Well, it's really simple. You need to declare that variable somewhere, without the extern keyword. Otherwise, the object does not exist.
And it's nasty because you have a global flying around, when you'd do better to have it all encapsulated in a class.
|
|
|
|
|
Christian Graus wrote: Well, it's really simple. You need to declare that variable somewhere, without the extern keyword. Otherwise, the object does not exist.
And it's nasty because you have a global flying around, when you'd do better to have it all encapsulated in a class.
can you gif me exampel of it ALL encapsulated in a class
and is a new class or in my exist class?
and when i define in scanner.h
Class{fstream myfile;};
i have error that not define fstream. then pleeeeez gif me exampel using my code above or any one
i am feeling taird of this problem
|
|
|
|
|
top7ob wrote: i have error that not define fstream.
Then #include fstream and put using std::fstream.
I'd put the class in a different header, and include it in the cpp files of the classes that use it. I'd make it static, and consider opening and closing the file every time.
|
|
|
|
|
i define new class named fileclass in new header
but my question is: where can i define the object of class
is in the main or out of main.
my problem is i need open file in main and read it from getT().
main() and getT in defrent files.
can you tell me is new class for file correct?
if not correct,correct it to me.
and where and how i define the object of text file is in 1,2,3,or4
-----sccaner.h
:((class fileclass<br />
{<br />
fstrem myfile1;<br />
fileclass::fileclass(){<br />
myfile.open(.........);<br />
}<br />
}<br />
----testscanner.cpp<br />
(<code>1)<br />
int main()<br />
{<br />
(2<br />
}
--------
file scanner.cpp
(3)<br />
getT()<br />
{<br />
(4)<br />
}
|
|
|
|
|
top7ob wrote: but my question is: where can i define the object of class
is in the main or out of main.
I said to make it a static class. That means the variables and methods are static, and you don't need to define an instance anywhere.
|
|
|
|
|
hi all..
i've done a small tool which load strings from a text file and puts it to a cstringarray. the stringarray is created on program startup and deleted on close. All worked ok for text files under 1MB, but if i load a 7 MB text file..and check in task manager...i can see about 100MB of RAM consumption.
there is some way to reduce this Ram abuse to a more reasonable value?
thanx in advance
|
|
|
|
|
I wish i knew
Just as a suggestion, try using a few smaller arrays, rather than one big one, who knows it just might help
|
|
|
|
|
Only 1428% overhead? That's not bad.
|
|
|
|
|
I had a similar problem the other week. Mine occured after manipulating and resizing large arrays. Try adding
SetProcessWorkingSetSize(GetCurrentProcess(),-1,-1);
to your code. Add it somewhere after the constructor has done all it's memory intensive work.
|
|
|
|
|
very thanx to all.
i used this code and the ram decreased to 1 MB...but obviously the virtual memory remains to about 100 MB.
The problem about doing a setsize is that the file is loaded by user input, and so i should scan the text file one time and count the number of words to set array size. And this kind of scanning on a 7MB file is slow.
|
|
|
|
|
ayol12122 wrote: there is some way to reduce this Ram abuse to a more reasonable value?
Im not entirely sure this is related or not as I use std::vector for arrays, but MSDN
CStringArray Class [^] has the following little tidbit that might be of interest to you.
MSDN wrote:
Before using an array, use SetSize to establish its size and allocate memory for it. If you do not use SetSize, adding elements to your array causes it to be frequently reallocated and copied. Frequent reallocation and copying are inefficient and can fragment memory.
I'd love to help, but unfortunatley I have prior commitments monitoring the length of my grass. :Andrew Bleakley:
|
|
|
|
|
ayol12122 wrote: ...and check in task manager...i can see about 100MB of RAM consumption.
Which is not necessarily how much RAM your process is using. The number reported by TM is actually the size of the address space. Even when you free memory, that number does not necessarily go back down. The is the way Windows' memory manager works.
"Approved Workmen Are Not Ashamed" - 2 Timothy 2:15
"Judge not by the eye but by the heart." - Native American Proverb
|
|
|
|
|
In a service that I wrote I am creating a process (using the CreateProcess API call) that is actually a bat file. When the service is signaled by the SCM that it should stop, I want to terminate the batch file and any child processes it has started. Is this possible? From looking at the props that SysInternals Process Explorer show, it would appear that any process launched by the batch file doesn't have a parent. Is there a way around this?
|
|
|
|
|
Jim Crafton wrote: Is there a way around this?
I don't know about "around" but why not through? Don't use createprocess on the "batch file", rather create the actuall processes and then your process will be the parent and it's all good.
led mike
|
|
|
|
|
Jim Crafton wrote: ...any process launched by the batch file doesn't have a parent.
Wouldn't cmd.exe be the parent?
"Approved Workmen Are Not Ashamed" - 2 Timothy 2:15
"Judge not by the eye but by the heart." - Native American Proverb
|
|
|
|
|
Apparently not according to Process Explorer. I would have thought the same thing and was really surprised to see that. Perhaps it's because I'm running this all through services?
|
|
|
|
|
Instead of using a batch file, run the apps from your own app. That way, you can call CreateProcess on all of them and stop them when you want to because you have the hwnd and processid.
"Why don't you tie a kerosene-soaked rag around your ankles so the ants won't climb up and eat your candy ass..." - Dale Earnhardt, 1997 ----- "...the staggering layers of obscenity in your statement make it a work of art on so many levels." - Jason Jystad, 10/26/2001
|
|
|
|
|
Is that why you are an "outlaw" programmer because you plagiarize posts?
led mike
|
|
|
|
|
Calling TerminateProcess is a bad idea. The API is only indented to be called in extreme circumstances. When called the .EXE and all its threads are killed on the spot without getting a chance to do any cleanup. None of the DLLs get the DLL_PROCESS_DETACH or DLL_THREAD_DETACH notifications.
Steve
|
|
|
|
|
Hi All,
I created a MFC SDI EXE app. I am trying to create an Automation server. I then added a MFC class to it and selected the "TypeID" option in the wizard. The Typelib for my automation server is getting generated correctly but the registration code (generated by wizard) is not Registering this new co class.
I checked that the .REG file generated doesn't have registry code for this new class (it has code only for the document registration) AfxOleRegisterTypeLib call is also present in the InitInstance of APP class. This call succeeds when I debug but I am unable to create object of the class because there is no entry created for it in registry.
I am using VS.NET 2003 IDE. Can someone guide me on this problem?
S o h a i l K a d i w a l a
To Err Is Human; to Debug, Divine
modified 21-Apr-21 21:01pm.
|
|
|
|
|
Hi all,
I have a problem, perhaps someone can help me...
I enabled my mfc-application to dynamically load plugin dlls (MFC dlls) via a specific api.
The plugin-dll is provided by a CWnd pointer to the container window of the application and creates its window by a call like this:
<br />
CWnd* CreateMainWindow(CWnd* pParentWnd, CString& strCaption, int& idToolbarResource, UINT* pCmdIDs, int& nCmdIDs)<br />
{<br />
<br />
AFX_MANAGE_STATE(AfxGetStaticModuleState());<br />
idToolbarResource = IDR_ANALYZER_TOOLBAR;<br />
pCmdIDs[0] = g_iFirstCmdID + CMDID_ANALYZER_NEW;<br />
pCmdIDs[1] = g_iFirstCmdID + CMDID_ANALYZER_IMPORT;<br />
<br />
nCmdIDs = 2;<br />
<br />
strCaption = "NC-Prozessanalyse";<br />
<br />
if(!g_AnalyzerView)<br />
{<br />
g_AnalyzerView = new CAnalyzerView;<br />
g_AnalyzerView->Create(NULL, (LPCTSTR)"", WS_CHILD|WS_VISIBLE, CRect(0,0,0,0), pParentWnd, 0, NULL);<br />
return g_AnalyzerView;<br />
}<br />
<br />
<br />
return NULL;<br />
}<br />
So, this all works fine and I get a nice window with all kinds of stuff in it all created by the dll class CAnalyzerView in this case. As u see, I also provide the frame app by a toolbar resource, and I do a kind of dynamic Command ID handling. Everything fine so far...
...except the thing with the Message Map...
Lets assume, my CAnalyzerView should have a Combo Box. I tried 2 ways to accomplish that:
1.) using the dialog editor to create a dialog resource (IDD_ANALYZER) with a Combo Box (IDC_TOOL_COMBO) and making CAnalyzerView derived from CFormView.
When the class creates, the combo box element is displayed correctly.
BUT as soon as I create a CComboBox member variable for the combo box which is bound to the resource by a call to
<br />
DDX_Control(pDX, IDC_TOOL_COMBO, m_ComboTools);<br />
the program crashes ;-(((
2.) Second, I tried to create all dialog control elements by hand. This is a really hard job when having multiple dialog controls... I created the m_ComboTools variable in the OnCreate method of CAnalyzerView (which in the meantime become CWnd derived again) like this:
<br />
m_ComboTools.Create(WS_CHILD | WM_NOTIFY | WS_VISIBLE | CBS_DROPDOWNLIST, CRect(0,0,0,0), this, IDC_TOOL_COMBO);<br />
m_ComboTools.SetOwner(this);<br />
m_ComboTools.SetParent(this);<br />
m_ComboTools.SetFont(this->GetFont()); <br />
then I created a Messagemap entry and a callback memberfunction like this:
<br />
BEGIN_MESSAGE_MAP(CAnalyzerView , CWnd)<br />
...<br />
ON_CBN_SELCHANGE(IDC_TOOL_COMBO, OnCbnSelchangeToolCombo)<br />
END_MESSAGE_MAP()<br />
The member function OnCbnSelchangeToolCombo is NEVER CALLED!!!
Then I tried to trap the WM_NOTIFY event by overriding the OnNotify member function of CWnd like this:
<br />
BOOL CAnalyzerView::OnNotify(WPARAM wParam, LPARAM lParam, LRESULT* pResult)<br />
{<br />
switch(wParam)<br />
{<br />
case IDC_TOOL_COMBO:<br />
if(lParam == CBN_SELCHANGE)<br />
OnCbnSelchangeToolCombo();<br />
break;<br />
case IDC_SEL_CHART:<br />
if(*pResult == CTCN_SELCHANGE)<br />
OnTcnSelchangeSelChart();<br />
break;<br />
<br />
}<br />
return CWnd::OnNotify(wParam, lParam, pResult);<br />
}<br />
I dont know, if the pResult or lParam parameter is responsible to deliver the Notify message. I tried both, with no effect. The IDC_TOOL_COMBO does not seem to send Notify messages.
The funny thing is, that the IDC_SEL_CHART control, which is of class CCustomTabCtrl, a class by Andrzej Markowski (here from Code Project) has no problem with sending notify messages... the CCustomTabCtrl was created the same way:
<br />
m_SelChart.Create(WS_CHILD | WS_VISIBLE, CRect(0,0,0,0), this, IDC_SEL_CHART);<br />
I dont know why it doesnt work with other elements.
I think it is a fundamental problem which lies in the architecture of the dynamically loaded mfc dll. The whole message map does not work properly, as well as the DDX stuff.
Everywhere at the interface to the frame app I used the
AFX_MANAGE_STATE(AfxGetStaticModuleState());
call as the class wizard generated code told me.
I don't know whats going wrong, please help! At this stage I have a well working plugin system, but I will have to forget it all if I couldnt get those controls and message maps to work.
Thanks in advance & plz excuse my bad english
ulretsam
|
|
|
|
|
Does DDX work in CWnd and CFormViews? I thought it was for CDialog-derived windows.
These lines shouldn't be necessary:
m_ComboTools.SetOwner(this);
m_ComboTools.SetParent(this);
Is your window class in a DLL or EXE?
None of this sounds related to MFC in a DLL to me, but there are issues (well documented) with
MFC extension DLLs (DLLs with classes which derive from MFC classes and are used by other MFC
applications).
|
|
|
|
|
Yes, you are right, DDX is for the automatic data transfer between controls and associated member variables of CDialog or CFormView derived classes.
The problem is that this mechanism works well in stand alone EXEs and DLLs which are linked at compile time.
My DLLs are linked at runtime via a call to LoadLibrary(), there is no chance for the compiler to puzzle all the message maps together I think. Somewhere there must lie the problem.
My window is created IN the DLL, the parent window is given to the DLL by a pointer to a CWnd, as you can see in my code.
Previously I said, that the whole Message map does not work. That was not correct. Messages for the window itself (i.e. WM_MOUSEMOVE, WM_CREATE, WM_SIZE) are delivered through the Message Map to the handler functions correctly. Only messages for the child windows like controls are not delivered.
I don't understand this behaviour... After 8 years MFC programming ;-((
|
|
|
|
|
ulretsam wrote: DDX is for the automatic data transfer between controls and associated member variables of CDialog or CFormView derived classes.
My mistake....I didn't realize DDX was part of CWnd, not CDialog.
Do you need to call UpdateData() to get MFC to call DoDataExchange()?
ulretsam wrote: My DLLs are linked at runtime via a call to LoadLibrary()
How do you link all the MFC classes once the DLL is loaded?? Wouldn't implicitly linking be
much easier??
Also, if you haven't done so already ... make sure you have something like this in your extension
dll:
static AFX_EXTENSION_MODULE MyDLLProjectDLL = { NULL, NULL };
extern "C" int APIENTRY
DllMain(HINSTANCE hInstance, DWORD dwReason, LPVOID lpReserved)
{
UNREFERENCED_PARAMETER(lpReserved);
if (dwReason == DLL_PROCESS_ATTACH)
{
if (!AfxInitExtensionModule(MyDLLProjectDLL, hInstance))
return 0;
new CDynLinkLibrary(MyDLLProjectDLL);
}
else if (dwReason == DLL_PROCESS_DETACH)
{
AfxTermExtensionModule(MyDLLProjectDLL);
}
return 1;
}
Also, your EXE should be set to use MFC in a dll, not statically linked.
|
|
|
|
|
|