|
Pointers do not generally marshall across process boundaries.
You will need to allocate memory using the GlobalAlloc function in order to pass the data between your two applications.
WM_SETTEXT has some special processing in it to marshall your pointers for you. I think the same goes with WM_GETTEXT and possibly a few other messages.
Build a man a fire, and he will be warm for a day Light a man on fire, and he will be warm for the rest of his life!
|
|
|
|
|
Paul Watt wrote:
You will need to allocate memory using the GlobalAlloc function in order to pass the data between your two applications.
I can't with pride use a function documented as being there to provide compatibility for 16 bits apps. And, are you really sure it does what it promises? Since Win32 doesn't have separate local and global heaps (only local, right?), how could that function allocate global heap?
Pointers do not generally marshall across process boundaries.
Yes, of course - I know that. Normally. But last night/morning at 5.30 AM, after long hours preparing for a first press demo of our product some hours later, neither me or my co-worker accepted this reason (happens way too often).
I told him (with an enlightened smile) "...but each process has its own address space and pointers from one doesn't translate to the other." Upon which he (of course) replied "Of course." But did we accept that? No. At that hour without any sleep, things should just work...
We already use WM_COPYDATA for IPC and that's the way to here also, but this morning I could have sworn there were no such thing as WM_COPYDATA...
Thanks anyway!
/Johann Gerell
|
|
|
|
|
I love reason messages like this. Every programmer worth his weight in salt has done stuff like this. It brings back so many "happy" memories.
Tim Smith
I'm going to patent thought. I have yet to see any prior art.
|
|
|
|
|
Paul Watt wrote:
You will need to allocate memory using the GlobalAlloc function in order to pass the data between your two applications.
That is incorrect. The local/global distinction is a holdover from Win16. From MSDN:Memory objects allocated by GlobalAlloc and LocalAlloc are in private, committed pages with read/write access that cannot be accessed by other processes. Memory allocated by using GlobalAlloc with GMEM_DDESHARE is not actually shared globally as it is in 16-bit Windows. This value has no effect and is available only for compatibility. Applications requiring shared memory for other purposes must use file-mapping objects. I wish it were still as easy as calling GlobalAlloc.
--Mike--
Friday's GoogleFight results: Britney Spears 2,190,000 - Erica Weichers 23
1ClickPicGrabber - Grab & organize pictures from your favorite web pages, with 1 click!
My really out-of-date homepage
Sonork-100.19012 Acid_Helm
|
|
|
|
|
Use WM_COPYDATA to send data between applications.
/ravi
Let's put "civil" back in "civilization"
http://www.ravib.com
ravib@ravib.com
|
|
|
|
|
Definately. That's what we've been doing and should without question continue to do. Early morning hours can do much damage to ones brain.
Thanks for the input!
/Johann Gerell
|
|
|
|
|
Johann Gerell wrote:
Early morning hours can do much damage to ones brain.
I couldn't agree more. Happens to me at least 5 times a day!
/ravi
Let's put "civil" back in "civilization"
http://www.ravib.com
ravib@ravib.com
|
|
|
|
|
What? Data between two applications?
This means inter-communication, so use Dynamic Data Exchange (DDE).
ZARZOR13
|
|
|
|
|
Has anyone developed a template class that emulates the VB For Each element In group ... Next.
where element is an object
and group is a collection of those objects
Gary Kirkham
A working Program is one that has only unobserved bugs
|
|
|
|
|
Me Think STL do this! vector, list , map, ...
Max.
|
|
|
|
|
Like Max mentioned, STL has a for_each template function. Look it up in MSDN.
Regards,
Alvaro
Well done is better than well said. -- Benjamin Franklin
(I actually prefer medium-well.)
|
|
|
|
|
Hey Guys,
I have a working MFC application (that I developed). I want to make the same work as a command line application (without bringing the GUI on screen). Meaning, the user should be able to use it just like a command, for example
MyMFCApplication -D -F *.txt
Where -D would be for download and -F is for file(s) OR any other option that I want later.
Could you guys please help me in understanding if this is possible at all?
If it is how to go about it so that I can have both modes.
Thanks
-Mahesh Shimpi
Ideas multiply by sharing!!
|
|
|
|
|
What you need to do is to look in your CWinApp derived class, and there scan the command line text, you'll need to run that way only if flags ( or a flag ) are provided, then simply do what you want to, and return without starting up your window.
Christian
No offense, but I don't really want to encourage the creation of another VB developer. - Larry Antram 22 Oct 2002
C# will attract all comers, where VB is for IT Journalists and managers - Michael P Butler 05-12-2002
Again, you can screw up a C/C++ program just as easily as a VB program. OK, maybe not as easily, but it's certainly doable. - Jamie Nordmeyer - 15-Nov-2002
|
|
|
|
|
|
Porting problem???
I have a set of defines:
#define PROT_NACK_NONE 0
#define PROT_NACK_BYE 1
…
…
…
#define PROT_NACK_BAD_PROT 3
________________________________
And I also have a typedef structure:
typedef struct reject_s
{
short int rejectCode;
const char *message;
} reject_t;
reject_t *m_rejectTable;
_________________________________
I than implement my function which uses the above:
void CMessageProtocol::setRejectTable( )
{//private:
static reject_t reject[]=
{
{ PROT_NACK_NONE, ""},
{ PROT_NACK_BYE, "Bye"},
{ PROT_NACK_NO_MORE_CON, "No More Connection availiable"},
{ PROT_NACK_BAD_PROT, "Protocol version not supported"},
{ PROT_NACK_BAD_ENC, "Encryption version not supported"},
{ PROT_NACK_BAD_APP, "Application refused"},
{ PROT_NACK_BAD_LOG_PASS, "Invalid Login or password"},
{ PROT_NACK_BAD_MSG, "Invalid Message format"},
{ PROT_NACK_DEFAULT, "Error"},
{ 0, 0}
};
m_rejectTable = reject;
}
The above has been complied and runs under Microsoft Visual Studio 6
I am now attempting to implement this into a .NET library, that has a bunch of __gc classes, when I now attempt to convert using the following syntax:
typedef __nogc struct reject_s
{
const char message;
short int RejectCode;
} reject_t;
reject_t* m_rejectTable;
typedef __nogc struct encrypting_s
{
char crypto;
char * encryptingName;
unsigned char cypher[2];
} encrypting_t;
encrypting_t* m_encryptingTable;
when I attempting to implement the __gc class method that use’s the above:
void GEMBrokerMessengerProtocol::CGEMMessageProtocol::setRejectTable()
{
static reject_t reject[]=
{
{ PROT_NACK_NONE, ""},
{ PROT_NACK_BYE, "Bye"},
{ PROT_NACK_NO_MORE_CON, "No More Connection availiable"},
{ PROT_NACK_BAD_PROT, "Protocol version not supported"},
{ PROT_NACK_BAD_ENC, "Encryption version not supported"},
{ PROT_NACK_BAD_APP, "Application refused"},
{ PROT_NACK_BAD_LOG_PASS, "Invalid Login or password"},
{ PROT_NACK_BAD_MSG, "Invalid Message format"},
{ PROT_NACK_DEFAULT, "Error"},
{ 0, 0}
};
m_rejectTable = reject;
}
I get the following error under Visual Studio C++.NET
c:\Documents and Settings\mdyer\My Documents\Visual Studio Projects\CGEMBroker\GEMBrokerMessengerProtocol.cpp(22): error C2440: 'initializing' : cannot convert from 'int' to 'GEMBrokerMessengerProtocol::CGEMMessageProtocol::reject_t'
c:\Documents and Settings\mdyer\My Documents\Visual Studio Projects\CGEMBroker\GEMBrokerMessengerProtocol.cpp(22): error C2689: Initializing 'reject' : this form of non-aggregate initialization requires a unary constructor
I am very curious as to why I am having these compile errors under .NET and not under my previous compile of Visual Studio 6???? Very lost here????
|
|
|
|
|
I'd suggest asking this in the MC+ forum if you're trying to create a .NET library. I'd also recommend const int over #define.
Christian
No offense, but I don't really want to encourage the creation of another VB developer. - Larry Antram 22 Oct 2002
C# will attract all comers, where VB is for IT Journalists and managers - Michael P Butler 05-12-2002
Again, you can screw up a C/C++ program just as easily as a VB program. OK, maybe not as easily, but it's certainly doable. - Jamie Nordmeyer - 15-Nov-2002
|
|
|
|
|
How do I increase the space between rows in a List Control? Is there a property I can change or can I change it in the DrawItem method without screwing things up?
thanks
Jason Henderson start page ; articles
henderson is coming
henderson is an opponent's worst nightmare
* googlism *
|
|
|
|
|
|
I'm pretty much abducting the drawing of this control already by using a customized DrawItem method. If I changed the rcItem RECT of the DRAWITEMSTRUCT parameter, would it screw up the whole list control? I really can't change it at the moment, otherwise I would find out for myself.
Jason Henderson start page ; articles
henderson is coming
henderson is an opponent's worst nightmare
* googlism *
|
|
|
|
|
I have
class BaseClass
{
virtual void SomeMethod();
}
class DerivedClass : public BaseClass
{
virtual void SomeMethod();
}
class AnotherDerivedClass : public DerivedClass
{
virtual void SomeMethod();
}
When I call AnotherDerivedClass::SomeMethod(), I will usually also call the base class method :
void AnotherDerivedClass::SomeMethod()
{
DerivedClass::SomeMethod();
}
in one case of class hierarchy, the middle class ( here DerivedClass ), do nothing more than just call the base class :
void DerivedClass::SomeMethod()
{
BaseClass::SomeMethod();
}
Is it good practice to have the DerivedClass::SomeMethod there ? or can I call BaseClass::SomeMethod() from the AnotherDerivedClass::SomeMethod() ?
The question, is it preferable to explicitly create empty virtual method just to call the base class so that I have a knowledge of the chain of ineritance ? or can I "jump" to the base class without going thrue the middle class if it does nothing ?
Thanks.
Max.
|
|
|
|
|
Maximilien wrote:
The question, is it preferable to explicitly create empty virtual method just to call the base class so that I have a knowledge of the chain of ineritance ? or can I "jump" to the base class without going thrue the middle class if it does nothing ?
IHMO, this would introduce an unnecessary overhead, only because you don't use a tool to draw the class hierarchy.
I see dumb people
|
|
|
|
|
Daniel Turini wrote:
this would introduce an unnecessary overhead
I know, but since it's not in a performance critical part of the software ( UI ) I can live with this.
Daniel Turini wrote:
, only because you don't use a tool to draw the class hierarchy.
I don't understand what you mean by that ?
Max.
|
|
|
|
|
If DerivedClass is not going to do anything but call the BaseClass virtual function then why even declare this function in this class.
If AnotherDerived will first do some stuff and then call the BaseClass virtual then you still do not need the function in the DerivedClass.
void AnotherDerivedClass::SomeMethod(){<br />
BaseClass::SomeMethod();
}<br />
What you choose to do should be based on what the program/design requirements are.
|
|
|
|
|
Good question. Here's my answer:
1. Your AnotherDerivedClass::SomeMethod can always call DerivedClass::SomeMethod. If DerivedClass does not have it, the compiler will automatically call BaseClass's method.
2. You can certainly call BaseClass::SomeMethod from AnotherDerivedClass. (This isn't allowed in Java, by the way).
3. You only need to have a (dummy) DerivedClass::SomeMethod whenever you have another method of the same name with a different set of parameters. Here's the example:
void DerivedClass::SomeMethod()
{
BaseClass::SomeMethod();
}
void DerivedClass::SomeMethod(int nParam)
{
}
If you didn't have DerivedClass::SomeMethod() in DerivedClass, the compiler would not allow you to call DerivedClass::SomeMethod, either from AnotherDerivedClass or through an instance of the class.
Regards,
Alvaro
Well done is better than well said. -- Benjamin Franklin
(I actually prefer medium-well.)
|
|
|
|
|
Alvaro Mendez wrote:
2. You can certainly call BaseClass::SomeMethod from AnotherDerivedClass. (This isn't allowed in Java, by the way).
I don't know Java ? so, in Java I'd have to call the base class method for each derive class ?
Alvaro Mendez wrote:
If you didn't have DerivedClass::SomeMethod() in DerivedClass, the compiler would not allow you to call DerivedClass::SomeMethod, either from AnotherDerivedClass or through an instance of the class.
Yep! that I know!
Thanks
Max.
|
|
|
|