|
If you are receiving a compiler error, make sure that windows.h is included.
"The pointy end goes in the other man." - Antonio Banderas (Zorro, 1998)
|
|
|
|
|
Thanks anyway - have solved it another way (in the C#).
J
---
|
|
|
|
|
Care to share?
"The pointy end goes in the other man." - Antonio Banderas (Zorro, 1998)
|
|
|
|
|
sure -
I just set the working directory before calling the DLL.
Environment.CurrentDirectory = Path.Combine(Application.StartupPath, "Working\\");
where /working/ is the directory I want to create the output files in.
The working directory is set by other functions also.
J
---
|
|
|
|
|
This post indicated you were getting compiler errors. I don't see the relationship between not having GetModuleFileName() or GetModuleFileNameEx() recognized by the compiler, and setting the working directory before calling a DLL.
"The pointy end goes in the other man." - Antonio Banderas (Zorro, 1998)
|
|
|
|
|
This post was a solution to my original problem.
---
|
|
|
|
|
Dear All,
I am a new comer of this message board. First let me say hi to you all ^_^
I am working on my project in my school which require me to check if there is any new file exist in a folder by using MFC. Since I am just start learning MFC a few weeks before, I totally have no idea about how I can do so........
Would anyone give me some advice on this in details?
Really thanks a lot!
Yours,
Meteor
|
|
|
|
|
Hi,
CFile f;
char* pFileName = "test.dat";
if( !f.Open( pFileName, CFile::modeRead | CFile::shareDenyNone ) )
{
#ifdef _DEBUG
afxDump << "File could not be opened " << "\n";
#endif
}
Sincerely Yours,
RadioShark
|
|
|
|
|
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);
|
|
|
|