|
Hello Friends,
I'm developing one MDI application.
In that I want to perform some task in ACtivated() event of each child.But whenever I'm activating MDIChild, activated() event of that child is not firing. Thats why I'm unable to perform my task.
Has anybody having any idea about this.
Thanks in advance.
Pranoti
|
|
|
|
|
Try using the MdiChildActivate instead for MDI child windows.
Rocky Moore
|
|
|
|
|
I'm new to C# and was looking for help on sending objects through sockets.
I have a program(which I got from this site) that sends bytes through a socket, it's a client/server chat program. I have written a class and made it Serializable and am trying to send instances of my class through the socket but haven't a clue how to actually serialize the object into bytes and send it through the socket.
Hope someone can help,
Paddy.
|
|
|
|
|
public byte[] GetObjectBytes(object o)
{
MemoryStream memstream = new MemoryStream();
IFormatter formatter = new BinaryFormatter();
formatter.Serialize(memstream, o);
memstream.Close();
return memstream.GetBuffer();
}
public object GetObjectFromBytes(byte [] bytes)
{
MemoryStream memstream = new MemoryStream(bytes);
IFormatter formatter = new BinaryFormatter();
object o = formatter.Deserialize(memstream);
memstream.Close();
return o;
}
I'm not a network guy, but I assume you just call the Write method on the NetworkStream object representing your socket, to send the byte array, then call the Read method on the other side to read back the byte array.
GetObjectBytes() will serialize the object and return the byte array which you can pass to Write, GetObjectFromBytes() will deserialize the byte array from the Read method.
HTH,
James
Simplicity Rules!
|
|
|
|
|
I am having sort of the same problems as you are. Instead I am trying to make class variables equal to the bytes returned from the socket. I sort of understand what James T. Johnson is giving you advise on; but, I don't know how to make a custom object in C#. Since I am using class variables instead of objects, I am leaving you this test code to show you how I convert the byte types to the variables in a class. This example requires the knowledge of byte masking and the use of Reflection. I am hoping to get some feedback plus maybe show you something new dealing with Reflection.
using System;
using System.Reflection;
namespace ConvertTypes
{
///
/// Summary description for ConvertTypes.
///
///
class ConvertClass
{
public int x;
public int y;
public bool z;
public ConvertClass(int i, int j, bool k)
{
x = i;
y = j;
z = k;
}
// Set the converted value
public void SetConvertClass(int i, string sName)
{
if(sName == "x")
x = i;
else
y = i;
}
}
class clsConvertTypes
{
///
/// The main entry point for the application.
///
[STAThread]
static void Main(string[] args)
{
ConvertClass mCls = new ConvertClass(0,0,true);
//Declare 8 Bytes for 2 int's
byte [] bTest = new Byte[8];
// get a Type Object representing ConvertClass
Type t = typeof(ConvertClass);
// get the fields from the Type object (ie int x, int y)
FieldInfo [] fi = t.GetFields();
// Start at index 0 which represents the x field
int iIndex = 0;
//Build the x value as 500000 and the y value as 400000
bTest[0] = 0x00; // 0x0007A120 = 500000
bTest[1] = 0x07;
bTest[2] = 0xA1;
bTest[3] = 0x20;
bTest[4] = 0x00; // 0x00061A80 = 400000
bTest[5] = 0x06;
bTest[6] = 0x1A;
bTest[7] = 0x80;
foreach(FieldInfo FI in fi)
{
if(FI.FieldType == typeof(int))
{
// Declare a temporary integer variable
int iTemp;
// Mask the byte array into a single integer
iTemp = (int)((bTest[iIndex]<<24) | (bTest[iIndex+1] << 16) |
(bTest[iIndex+2] << 8) | bTest[iIndex+3]);
// increment the index by 4 bytes since it is a int
iIndex = iIndex + 4;
// Declare an object which will be used to pass
// parameters to the SetConvertClass method
object[] targs = new Object[2];
targs[0] = iTemp; //First argument
targs[1] = FI.Name; //Second argument (x or y)
// Get all methods associated with ConvertClass
MethodInfo[] mi = t.GetMethods();
foreach(MethodInfo m in mi)
{
//Compare to the name of the method
if(m.Name.CompareTo("SetConvertClass") == 0)
{
Console.WriteLine("Setting the {0} value to {1}",
FI.Name,iTemp);
//Invoke the method using Reflection
m.Invoke(mCls,targs);
}
}
}
else
Console.WriteLine ("Don't do anything with the {0} field",
FI.Name);
}
Console.WriteLine("x is {0} y is {1}",mCls.x,mCls.y);
}
}
}
The Long Way,
Tom McDaniel
|
|
|
|
|
That's pretty what the binary serializer does except it has type safety built in.
Using the methods I created you would do something like this.
private byte[] GetMyClassBytes(MyClass mc)
{
return GetObjectBytes(mc);
}
private MyClass GetMyClassFromBytes(byte[] bytes)
{
return (MyClass) GetObjectFromBytes(bytes);
} To go from object to a specifc class you just need to cast or use the as keyword if you don't want to throw an exception if it is the wrong type (return GetObjectFromBytes(bytes) as MyClass returns null if the object isn't of type MyClass).
James
Simplicity Rules!
|
|
|
|
|
Thanks for the help. I haven't got a chance to try it out yet but that should fix the problem. I'll give it a go later on.
I can't get my head around Tom's code though coz I'm only learning C# at the moment.
Thanks,
Paddy.
|
|
|
|
|
Paddy thanks for starting this discussion. I knew there was an easier way of doing what we wanted. It just takes time to learn and get help on the in's and out's of the language.
Thank you James for your help. You've solved the problem that I am having.
Thanks again,
Tom McDaniel
|
|
|
|
|
No problem, James has solved the problem for me too.
I know what you mean about the in's and out's, I find it's always something small that gets me stuck for days but it's great when someone can give you the solution straight away off the top of their head!
Thanks James,
Paddy.
|
|
|
|
|
The GetObjectBytes does not return the bytes as expected. Consider the following code.
using System;
using System.IO;
using System.Threading;
using System.Text;
using System.Runtime.Serialization;
using System.Runtime.Serialization.Formatters.Binary;
namespace CBinFormatter
{
///
/// Summary description for Class1.
///
class CBinFormatter
{
[Serializable()]
public struct sValues
{
public int iFirst;
public int iSecond;
public int iThird;
}
///
/// The main entry point for the application.
///
[STAThread]
static void Main(string[] args)
{
//
// TODO: Add code to start application here
//
sValues sVal = new sValues();
sVal.iFirst = 100;
sVal.iSecond = 300;
sVal.iThird = 400;
byte [] btVal = GetObjectBytes(sVal);
Console.WriteLine("The size of the btVal is " + btVal.Length);
}
static byte[] GetObjectBytes(object o)
{
MemoryStream memstream = new MemoryStream();
IFormatter formatter = new BinaryFormatter();
formatter.Serialize(memstream, o);
memstream.Close(); // Prevent further writing
return memstream.GetBuffer();
}
static object GetObjectFromBytes(byte [] bytes)
{
MemoryStream memstream = new MemoryStream(bytes);
IFormatter formatter = new BinaryFormatter();
object o = formatter.Deserialize(memstream);
memstream.Close(); return o;
}
}
}
The Binary Serializer will return a size which is greater than the three int variables from the structure. Plus, when looking at the byte values within the debugger, I can't find the 100, 300, 400. I would of expected that the bytes returned would of been the size of 12 bytes " 3 int values - 4 bytes each". Do you know what I am missing here?
Tom McDaniel
|
|
|
|
|
The binary serializer includes information so that it can deserialize the data correctly. It includes type information (so that it can instantiate the object then load the data into it).
Eric Gunnerson pointed out a way to convert from a byte array to the object which is extremely easy; I haven't figured out how to get the byte array as easily though.
Here is a test program which shows how it works; compile with the /unsafe compiler switch.
using System;
using System.Runtime.InteropServices;
namespace Test
{
public struct Data
{
public int i;
public int j;
public int k;
}
public class Driver
{
public static void Main(string [] args)
{
byte [] bytes;
Data data;
Data foo;
data.i = 1;
data.j = 2;
data.k = 3;
bytes = ToByteArray(data);
foo = FromByteArrayToData(bytes);
System.Console.WriteLine("{0}, {1}, {2}", foo.i, foo.j, foo.k);
}
private static byte[] ToByteArray(object data)
{
int sizeofData = Marshal.SizeOf(data);
IntPtr pHData = Marshal.AllocHGlobal(sizeofData);
Marshal.StructureToPtr(data, pHData, true);
byte [] bytes = new byte[sizeofData];
Marshal.Copy(pHData, bytes, 0, sizeofData);
Marshal.FreeHGlobal(pHData);
return bytes;
}
unsafe private static Data FromByteArrayToData(byte[] bytes)
{
fixed(byte* pBytes = bytes)
{
return *((Data*) pBytes);
}
}
}
}
I'd be interested in knowing if there is a "short and sweet" version of the ToByteArray method. It seems like unsafe code could do the conversions, since it has no problems converting a byte array to an object.
James
Simplicity Rules!
|
|
|
|
|
Thanks again James. This is what I expected to see out of the byte array. Yes, I would also be interested in knowing a "short and sweet" version of the ToByteArray. Before using this forum, I was trying to do the same thing with C# pointers; but, I could never get what I needed. Then I started looking for a "memcpy" function in C#. I am guessing that the Marshal Object sort of does the same thing as the C++ memcpy function.
Thanks again,
Tom McDaniel
|
|
|
|
|
Hi!
I have following structures:
[ StructLayout( LayoutKind.Sequential, CharSet=CharSet.Ansi )]
struct ISEG
{
public short soffset; // segment position (offset)
public short slength; // segment length
public short segmode; // segment mode
}
[ StructLayout( LayoutKind.Sequential, CharSet=CharSet.Ansi )]
struct IIDX
{
public short inumseg; // number of segments
public IntPtr seg; // (ISEG*) segment information
// + some other data
}
So IIDX structure contains pointer to array of ISEG structures, inumseg defines how many structures there is in array.
And I have following DLL function that uses IIDX structure:
// short (__cdecl * Open)( pIIDX indexPtr );
[DllImport( "mydll.dll")]
private static extern short Open( ref IIDX indexPtr );
In unmanaged C/C++ you would use structure following way:
IIDX udtIndex;
ISEG udtBseg[2];
udtIndex.inumseg = 2;
udtIndex.seg = udtBseg;
udtBseg[0].soffset = 1;
udtBseg[0].slength = 2;
udtBseg[0].segmode = 1;
udtBseg[1].soffset = 3;
udtBseg[1].slength = 2;
udtBseg[1].segmode = 1;
Open( &udtIndex );
So, my problem is how I marshal ISEG array pointer to IIDX structure in C#? Should I first allocate memory for two ISEG structures, and then marshal each ISEG structures to right positions in the allocated memory? Or is there easier way to do marshaling (like function or attribute)? Could I use unsafe blocks to get pointer to the array? Any samples?
Thank you!
|
|
|
|
|
I'm trying to load a xml into a XmlDocument that have a DTD with a default attribute. And I only obtain a xml without the attributes. What am I doing wrong???
My code is:
using System;
using System.Xml;
namespace ConsoleApplication1
{
public class SchemaCollectionSample
{
public static void Main ()
{
XmlDocument x =new XmlDocument();
XmlTextReader reader = new XmlTextReader("book4.xml");
XmlValidatingReader vreader =new XmlValidatingReader(reader);
x.Load(vreader);
System.Console.Out.WriteLine(x.LastChild.OuterXml);
}
}
}
the Book.dtd is:
<!ELEMENT book (title,price)>
<!ATTLIST book
genre CDATA "novel"
ISBN CDATA #REQUIRED>
<!ELEMENT title (#PCDATA)>
<!ELEMENT price (#PCDATA)>
the book4.xml is:
<!DOCTYPE book SYSTEM 'book.dtd'>
<book ISBN = '1-861001-57-5'>
<title>Pride And Prejudice</title>
<price>19.95</price>
</book>
Crivo
Automated Credit Assessment
|
|
|
|
|
Whaaaaaaaaaat is that?
I've heard it too many times to keep this question in my hands, I just have to ask!
And where to learn, I know a liiiiiiitle in what it is... and it interest me to try build my servers as Windows services.
Where to learn Windows services in C# and C++....
Rickard Andersson@Suza Computing
ICQ#: 50302279 (Add me!)
E-mail: nikado@pc.nu
I'm from the winter country SWEDEN!
|
|
|
|
|
|
Thanks man!
But I just read it through fast, could you tell me why I should use a Windows service?
Can I run a Windows service in the background and the user can't close my app?
Rickard Andersson@Suza Computing
C# and C++ programmer from SWEDEN!
UIN: 50302279
E-Mail: nikado@pc.nu
Speciality: I love C# and C++!
|
|
|
|
|
Rickard Andersson wrote:
could you tell me why I should use a Windows service?
They run even without a user having to log in! Thus if you want to write a web server or something like that, you can write it as a service and leave the machine turned on, but nobody logged in. People can login and logout without any problem
Nish
Regards,
Nish
Native CPian.
Born and brought up on CP.
With the CP blood in him.
|
|
|
|
|
Aaah!
Then I know how it works and what's so specific with it!
I will try it out!
Rickard Andersson@Suza Computing
C# and C++ programmer from SWEDEN!
UIN: 50302279
E-Mail: nikado@pc.nu
Speciality: I love C# and C++!
|
|
|
|
|
Rickard Andersson wrote:
I will try it out!
Good Luck!
Nish
Regards,
Nish
Native CPian.
Born and brought up on CP.
With the CP blood in him.
|
|
|
|
|
One more question... the InstallFirstService, is it the program that "config the OS to start a service" when starting the OS, if you know what I mean?!
Rickard Andersson@Suza Computing
C# and C++ programmer from SWEDEN!
UIN: 50302279
E-Mail: nikado@pc.nu
Speciality: I love C# and C++!
|
|
|
|
|
Rickard Andersson wrote:
One more question... the InstallFirstService, is it the program that "config the OS to start a service" when starting the OS, if you know what I mean?!
InstallFirstService registers the service with the service control manager. Take a look at this class of mine which makes it easier for you to install/de-install services as well as start/stop/pause/continue services
CServiceHelper
Nish
Regards,
Nish
Native CPian.
Born and brought up on CP.
With the CP blood in him.
|
|
|
|
|
Nish - Native CPian wrote:
People can login and logout without any problem
Thats not exactly one of its strong selling points but hey its a point
|
|
|
|
|
When I associate a ContextMenu with a NotifyIcon, the MenuItems' Popup event doesn't fire, can anyone tell me if this is a bug inside the framework or am I doing something wrong ? I'm quite confused here...
|
|
|
|
|
See if this article helps. Else post some code snippets.
http://www.codeproject.com/csharp/trayiconmenu01.asp
Nish
Regards,
Nish
Native CPian.
Born and brought up on CP.
With the CP blood in him.
|
|
|
|