|
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
|
|
|
|
|
|
Thanks for answer, I've seen this before,
but it seems to be too complicated,
but maybe I'll have to use it
rrrado
|
|
|
|
|
Hi,
.NET Framework has built-in classes to work with PNG files.
Sincerely Yours,
RadioShark
|
|
|
|
|
This is the unmanaged C++ forum
--
Ich bin der böse Mann von Schweden.
|
|
|
|
|
I was wondering how to GET/SET the mouse direction settings...
There is a tab in Windows's Config Panel > Mouse where you can click on a red-white balloon. If you do, you'll have to move the mouse upwards. This option is for calibration.
But where are these parameters stored and how to edit them?
|
|
|
|
|
Hi all,
I'm kinda new to MFC and come from the world of Java so please bear with me.
I have a dialog on which (amongst other things) I want to display a CPropertySheet (along with CPropertyPages ofcourse). Being the newbie that I am, I did the following:
In the OnInit() method of my dialog I put down the following code:
<br />
m_ps.Construct("Test Property Sheet", this, 0);<br />
m_ps.SetWindowPos(this, 50,50,100,100, 0);<br />
m_ps.ShowWindow(SW_SHOW);
This doesn't work (and also causes an assert).
Can anyone help me out please?
|
|
|
|
|
An easier solution would be to use a CPropertySheet rather than a CDialog as the main window. While the articles themselves are not about the steps involved in doing this, I have an example here and here.
"The pointy end goes in the other man." - Antonio Banderas (Zorro, 1998)
|
|
|
|
|
But I need to add a tree control outside the property sheet and have nodes on the tree add/remove pages from the property sheet accordingly. I think this can't be done with the CPropertySheet as a main window.
Will look at the examples tho.
Thanks
|
|
|
|
|
Gotcha. It always helps to state all the necessary requirements so that unnecessary suggestions can be avoided.
"The pointy end goes in the other man." - Antonio Banderas (Zorro, 1998)
|
|
|
|
|
You can create the property sheet as a child of your main dialog. See this[^] MSDN link for instructions. Alternatively, you could use a CTabCtrl and a bunch of child windows (a la "property pages"). See this[^] thread for info. Personally, I prefer the latter.
/ravi
My new year's resolution: 2048 x 1536
Home | Articles | Freeware | Music
ravib@ravib.com
|
|
|
|