|
Oh....I forget to mention that I have to check it continuously, i.e. when I start the program, I have to be able to check it after clicking "Start" button and it will loop continuously to check.....
Will your method be ok on that also?
^_^
Yours,
Meteor
|
|
|
|
|
StarMeteor wrote:
...and it will loop continuously to check...
If that is your requirement, use ReadDirectoryChangesW() and/or FindFirstChangeNotification() instead.
Unless it is done infrequently, polling the OS in a loop is not very efficicent.
"The pointy end goes in the other man." - Antonio Banderas (Zorro, 1998)
|
|
|
|
|
Oh.....actually I have looked in this site and read an article about the API you mentioned...but I don't understand it much....especially what I need to use it and how to initialize ..... T_T
|
|
|
|
|
fwatch.exe is a good example.
"The pointy end goes in the other man." - Antonio Banderas (Zorro, 1998)
|
|
|
|
|
Oh...I found that I forget to defind #define _WIN32_WINNT 0x400 at stdafx.h in order to use the API....
I can use it now!
Thanks a lot~
|
|
|
|
|
How about _access() , or CFile::GetStatus() ?
"The pointy end goes in the other man." - Antonio Banderas (Zorro, 1998)
|
|
|
|
|
Hi all!
I have a base class, CFeature, from which other classes are derived such as CFeatureLine for example. CFeature has a virtual operator, void draw(), which the derived classes always override.
Creating an instance of the derived class, CFeatureLine *pX=new CFeatureLine(...), then serializing it works fine - no problem.
However, in order to de-serialize I use the following code:
CFeature *pFeature; // i use CFeature so that any derived class may be loaded
ar >> pFeature;
But now whenever the draw function of pFeature is called, the compiler directs control to the base class draw function, and not the derived class. This might seem logical, but it appears that MFC's serialization doesn't instantiate a derived class, and instead instantiates the base class, even though the serialization mechanism is supposed to instantiate the class it was saved as.
One way round this is to store a feature type along with the feature data in order to instantiate the appropriate class upon loading, but this is very ugly, and non-modular.
Do you know of a way to solve this? Any help would be great.
Paul.
|
|
|
|
|
First: ar >> pFeature will read the pointer value, not the contents of object!
If you want to serialize objects of different types, you have to store a type information with each object, even it seems ugly to you. The stream is only a sequence of bytes, and you haven't any type information, unless you store it explicitly.
You should use the standard MFC serialization through CObject and CRuntimeClass , it is quite modular but IMHO non-elegant. And you must derive your objects from CObject , clearly.
Or you can write your own class factory. Class factory is an object, to that you pass an type ID, and the factory creates an instance of type described by the ID. For details see this article.
Robert-Antonio
"I launched Norton Commander and saw, drive C: on the left, drive C: on the
right...Damn, why I need two drives C:??? So I formatted one..."
|
|
|
|
|
Hi Robert-Antonio,
Issuing "ar >> pFeature" will not read the pointer, because the serialization mechanism uses pointers only - unless you specifically call the Serialize(CArchive &ar) function of a serializable class. So, in fact, "ar >> pFeature" will cause MFC to create a new instance of the class CFeature on the heap (pointed to by pFeature), and load the object into that memory location.
Paul
|
|
|
|
|
sntpaul wrote:
Do you know of a way to solve this? Any help would be great
When you serialize an object derived from CFeature , first serialize its signature (a unique id that identifies its class type), then serialize the rest of the object. During deserialization, pass the signature to the factory method CFeature::create (signature) , and use the returned CFeature -derived object to deserialize itself.
CString strSignature;
strSignature << *pArchive;
CFeature* pFeature = CFeature::create (strSignature);
ASSERT (pFeature != NULL);
pFeature->serialize (*pArchive);
See this[^] series of articles for detail.
/ravi
My new year's resolution: 2048 x 1536
Home | Articles | Freeware | Music
ravib@ravib.com
|
|
|
|
|
Hi Ravi,
This sounds very promising, but the CFeature does not have a create function! It does have a CreateObject function - are these similar? I'm not sure how to get the signature either, but will look into it more...
Paul
|
|
|
|
|
sntpaul wrote:
CFeature does not have a create function
You need to add this method to it. The signature is nothing special - it can be a const int or const CString that's unique to subclasses of CFeature . Btw, this is a typical case of the "factory" design pattern.
static CFeature* create
(CString strSignature);
CFeature* CFeature::create
(CString strSignature)
{
if (strSignature == CFeature::sigFoo)
return (new CFooFeature());
if (strSignature == CFeature::sigBar)
return (new CBArFeature());
...
ASSERT (FALSE);
return (NULL);
}
/ravi
My new year's resolution: 2048 x 1536
Home | Articles | Freeware | Music
ravib@ravib.com
|
|
|
|
|
Thanks Ravi,
I will give it a shot
Paul
|
|
|
|
|
I have created a simple Form project and tried to mix C++ and my existing C code. With problems of course. There is no need for controls on the form to try this example. Here is the important code.
/* BEGIN - don.c */
/* ############################################################ */
/* ### This just a cut-down example of my C code ### */
/* ############################################################ */
/* ### The fact that it is C code and not C++ cannot change ### */
/* ############################################################ */
#include <stdio.h>
extern void showme(int); /* call this routine in Form1.h */
int magiccalc() /* Magic calculation - written in C */
{
showme(3); /* use the integer 3 instead of showing the calculations code */
return(0);
}
/* ############################################################ */
/* END - don.c */
/* BEGIN - Form1.h */
#pragma once
extern int magiccalc(void);
namespace sim50avc
{
using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;
///
/// Summary for Form1
///
/// WARNING: If you change the name of this class, you will need to change the
/// 'Resource File Name' property for the managed resource compiler tool
/// associated with all .resx files this class depends on. Otherwise,
/// the designers will not be able to interact properly with localized
/// resources associated with this form.
///
public __gc class Form1 : public System::Windows::Forms::Form
{
public:
Form1(void)
{
int num;
InitializeComponent();
num = magiccalc(); /* Call magiccalc in don.c */
/* num is a meaningless return value */
}
protected:
void Dispose(Boolean disposing)
{
if (disposing && components)
{
components->Dispose();
}
__super::Dispose(disposing);
}
private: System::Windows::Forms::TextBox * inputBox;
private: System::Windows::Forms::TextBox * outputBox;
private:
///
/// Required designer variable.
///
System::ComponentModel::Container * components;
///
/// Required method for Designer support - do not modify
/// the contents of this method with the code editor.
///
void InitializeComponent(void)
{
this->inputBox = new System::Windows::Forms::TextBox();
this->outputBox = new System::Windows::Forms::TextBox();
this->SuspendLayout();
//
// inputBox
//
this->inputBox->Location = System::Drawing::Point(16, 24);
this->inputBox->Multiline = true;
this->inputBox->Name = S"inputBox";
this->inputBox->Size = System::Drawing::Size(256, 88);
this->inputBox->TabIndex = 1;
this->inputBox->Text = S"inputBox";
//
// outputBox
//
this->outputBox->Location = System::Drawing::Point(16, 184);
this->outputBox->Multiline = true;
this->outputBox->Name = S"outputBox";
this->outputBox->Size = System::Drawing::Size(256, 88);
this->outputBox->TabIndex = 2;
this->outputBox->Text = S"";
//
// Form1
//
this->AutoScaleBaseSize = System::Drawing::Size(5, 13);
this->ClientSize = System::Drawing::Size(292, 302);
this->Controls->Add(this->outputBox);
this->Controls->Add(this->inputBox);
this->Name = S"Form1";
this->Text = S"Form1";
this->ResumeLayout(false);
}
public:
void __cdecl showme(int thenum)
{
MessageBox::Show(S"abc", S"Result...");
}
};
}
/* END - Form1.h */
/* Thank You in advance */
Don
|
|
|
|
|
I can send the project in a zip file if anyone is willing to look at it.
Thanks
Don
|
|
|
|
|
so, what's the question ? what's the problem ?
maybe you'll get better help in the managed-C++ forum.
Maximilien Lincourt
Your Head A Splode - Strong Bad
|
|
|
|
|
try: extern "C" int magiccalc(void);
|
|
|
|
|
It's the second line of code in Form1.h
Thanks though
|
|
|
|
|
Well, it's not the same extern "C" than just extern.
In C++ some compilers add extra information to the function names (type of parameters, type of return,..). To avoid this problem, use the extern "C" declaration in all the 'C' functions.
|
|
|
|
|
Here are the 2 errors.
sim50avc fatal error LNK1284: metadata inconsistent with COFF symbol table: symbol '?magiccalc@@$$FYAHXZ' (0A00002D) mapped to '?magiccalc@@$$J0YAHXZ' (06000001) in don.obj
c:\other\vc_projects\sim50avc\Form1.h(97): warning C4440: calling convention redefinition from '__clrcall ' to '__cdecl ' ignored
|
|
|
|
|
Here is a possible short cut: If the C code is part of the project then you could just changed the extention to cpp. Then you will not need to modify it or the header, unless the C code is doing conversions or something else that the C++ compiler wants you to make sure you know what you are doing. Remember that C++ is a superset of C and therefore your C code can be compiled as C++. If you do not whish to change the file extesion then you will need to use the extern "C" any where there is an external C function declared.
For future reference you may want to write your C code and test it then change the extesion to cpp and then recompile in order is see where the code can be improved. Make correction then change the extension back to C and retest. This will help improve your C coding and understanding of the C language.
Well, good luck.
INTP
|
|
|
|
|
I made a MFC DLL that I call from VB. everything seems to work fine in the dll (exporting data from a mysql query to a .dbf file), but when I end the app, I get some type of memory error. I posted a question about this yesterday and someone told me that the dll wasn't cleaning up behind itself correctly. I really don't understand how to do this. And since it's a dll with MFC statically linked I don't have a dllmain() function. Any help?
thanks in advance
If it's broken, I probably did it
bdiamond
|
|
|
|
|
Add an ExitInstance to your DLL CWinApp class and put some code to cleanup or free memory in the ExitInstance function.
|
|
|
|
|
I need to load an 32 bit bitmap into my application.
BMP is too big, I need to have it stored in some
losless compressed format, like PNG.
Does anyone know about some free lightweight decode only library
for loading PNG ?
It can also be another standard, free image format which can store
true color bitmaps using lossless compression.
Thanks !
rrrado
|
|
|
|
|