|
I've now gone bald trying to figure out what is wrong with this simple code. Please help if you can.
The C# application has:
Managed oManaged = new Managed();
string myString = "My string";
oManaged.SetStringValue(myString);
The MC++ DLL has class Managed, where Managed::Managed() consists of:
m_pUnmanaged = new CUnmanaged();
and Managed::SetStringValue(String* strValue) consists of:
m_pUnmanaged->SetStringValue(strValue);
The C++ extension DLL has class CUnmanaged,
where CUnmanaged::SetStringValue(CString strValue) consists of
m_strValue = strValue; // m_strValue is declared as a CString
When I run it, one of two things happens. Either I get an error in CUnmanaged::SetStringValue() saying that object reference is not set to an instance of an object, even though in the debugger I can see in Managed::SetStringValue() that the value of the string passed in is perfectly good. Or, if I get past that (depends on how many times I recompile whether I get past it or not ;{), I get a debug assertion in the C# program of type BLOCK_TYPE_IS_VALID, presumably indicating that the heap is screwed up.
|
|
|
|
|
what are you trying to accomplish???
IM PROUD TO BE A GMAIL;
|
|
|
|
|
I'm trying to wrap an unmanaged C++ class in an extension DLL with a managed C++ class in its own DLL so that I can use the managed class in a C# program. All of this is very easy to do IF the unmanaged class does not use any MFC classes. But if it has arguments or return values that are, for example, CStrings, then I have been unable to get it to work, nor have I seen a single example of such posted anywhere on the internet.
|
|
|
|
|
aren't cstrings the same thing as strings in the .net platform?
IM PROUD TO BE A GMAIL;
|
|
|
|
|
no, they aren't the same. You can marshal a .net string into other types, like a character array, which can be put into a CString, but that doesn't make them the same. Since you don't know the answer, thanks anyway. Can someone else shed any light?
|
|
|
|
|
I figured out how to do it, in case anyone is interested.
I wrote:
> The MC++ DLL has class Managed, where Managed::Managed() consists of:
> m_pUnmanaged = new CUnmanaged();
> and Managed::SetStringValue(String* strValue) consists of:
> m_pUnmanaged->SetStringValue(strValue);
That line "m_pUnmanaged->SetStringValue(strValue);" has to be replaced with:
IntPtr stringPointer = Marshal::StringToHGlobalAnsi(strValue);
m_pUnmanaged->SetStringValue(static_cast<char *="">(stringPointer.ToPointer()));
Marshal::FreeHGlobal(stringPointer);
That gets rid of the error about "object reference is not set to an instance of an object".
But it still leaves the C# program asserting when it closes. That is solved by changing the MC++ DLL to link statically with MFC, not dynamically. Why that would be required, I have no idea.
Finally, although I already knew this before I made my original post, it is required to change the MC++ DLL from its default settings to those outlined in http://support.microsoft.com/default.aspx?scid=kb;en-us;814472
(PRB: Linker Warnings When You Build Managed Extensions for C++ DLL Projects)
|
|
|
|
|
Hello,
I have developed a Smart Device Application for a PocketPc, now I want to add a kind of instrumentation mechanism to my mobile application to save information like when (time), which method with which parameters from which class is called, in a file directly on the PocketPc. Has anybody good ideas how I can realize that in a good way? - means not much code changing and not much negative impacts on the performance of the mobile application.
thx
ma
|
|
|
|
|
Looks like you need a profiler. These programs tend to be very expensive ($$$) and they have to run on the machine while the program is running.
|
|
|
|
|
But I already read that it is possible when I change something in the code of the Smart Device Application...?
regards
mat
|
|
|
|
|
Never heard of it. Not without using a profiler anyway...
RageInTheMachine9532
"...a pungent, ghastly, stinky piece of cheese!" -- The Roaming Gnome
|
|
|
|
|
Is it not possible to write an own class which takes over the logging mechanism?
|
|
|
|
|
You could, but there is nothing that will call the log mechanism. You'll have to add code to every method you have already written to cal the logging class with the name of the method and the parameters that were passed. There is no built in mechanism to do this...
RageInTheMachine9532
"...a pungent, ghastly, stinky piece of cheese!" -- The Roaming Gnome
|
|
|
|
|
The following code compiles fine but when attempting to run it from debug mode, the compiler breaks on "Send(args[0]);" And generates the following exception:
An unhandled exception of 'System.IndexOutOfRangeException' occurred in UDPSender01.exe
Additional information: Index was outside the bounds of the array.
This project was setup as a simple c# console.
using System;
using System.Net;
using System.Net.Sockets;
using System.Text;
public class UDPMulticastSender
{
private static readonly IPAddress GroupAddress =
IPAddress.Parse("224.168.100.2");
private static int GroupPort = 11000;
private static void Send( String message)
{
UdpClient sender = new UdpClient();
IPEndPoint groupEP = new IPEndPoint(GroupAddress,GroupPort);
try
{
Console.WriteLine("Sending datagram : {0}", message);
byte[] bytes = Encoding.ASCII.GetBytes(message);
sender.Send(bytes, bytes.Length, groupEP);
sender.Close();
}
catch (Exception e)
{
Console.WriteLine(e.ToString());
}
}
public static int Main(String[] args)
{
Send(args[0]);
return 0;
}
}
Thanks,
Moe
|
|
|
|
|
win32wiz wrote:
Send(args[0]);
That line will cause an IndexOutOfRangeException to be thrown if no arguments have been passed. You can specify command line arguments to be passed to the application when running in debug mode in Visual Studio by going to Project -> {Project Name} Properties... -> Configuration Properties -> Debugging and entering them on the line labeled Command Line Arguments (under Start Options).
Charlie
if(!curlies){ return; }
|
|
|
|
|
I have just started with Direct3D in C#. It's great so far, but I have a problem when I want to "fade" my scenes out... I remember I was able to use the D3DDevice::Clear function in C++, and I could interpolate the alpha channel. This does not seem to work in C#. Anyone have an idea? Is there another way which is more efficient?
Thanks.
J.
|
|
|
|
|
Hi,
I would like to know how to instantiate a class from which I do not know the type.
I have a class that contains a property in which I want to store an object of a type which is derived from Base_Class. I do not know which of the derived types my object will be.
I also want to be able to instantiate this object of unknown type at runtime.
How could I achieve this ?
-----------------------------------
Alexandre Rondeau
alexandrer@contekonline.com
|
|
|
|
|
|
I developed a C# apps to retrieve pop3 email, the result I got is something like below:
Return-Path: <user@main.com><br />
Delivered-To: user@main.com<br />
Received: (qmail 55301 invoked by uid 89); 3 Nov 2004 00:07:53 +0800<br />
Message-ID: <20041102160753.55300.user@main.com><br />
From: "Victor Tai" <user@main.com><br />
To: user@main.com<br />
Subject: Email Extream Test 11<br />
Date: Wed, 03 Nov 2004 00:07:53 +0800<br />
Mime-Version: 1.0<br />
Content-Type: text/plain; format=flowed; charset="utf-8"<br />
Content-Transfer-Encoding: 7bit
How do I separate them into line so that I can get the variable like From, To, Subject? I try to identify by "\n", but it gave me wrong result...
Thanks.
|
|
|
|
|
You should use regular expressions, which are stored in System.Text.RegularExpressions namespace.
For example
<br />
string header = (Your header),match="";<br />
Regex r = new Regex("Subject:.*");<br />
Match m=r.Match(header);<br />
if(m.Success){<br />
match = m.Value;<br />
} <br />
Now match contains the line beginning with "Subject:".
|
|
|
|
|
Does any one know if there is a way to default the ListView Checkbox Control to checked?
|
|
|
|
|
Duh, I figured it out
|
|
|
|
|
Hi there!
I create a panel and finally I can put him in a Form \o/ (thanks Stefan Troschütz )
But now I have a problem, I want to control the location of the panel in the main application. In order that I create two variables
public int locationX, locationY;
public int LocationX
{
get
{
return locationX;
}
set
{
locationX = value;
}
}
public int LocationY
{
get
{
return locationY;
}
set
{
locationY = value;
}
}
The problem is when I make the following instructions =/
panelClass panelCenas = new panelClass();
panelCenas.LocationX = 10;
panelCenas.LocationY = 50;
this.Controls.Add(panelCenas);
The program doesn´t execute the two instructions in the middle, I think that is because when I create a panel, it executes the initialize component and there isn´t any mention there to the Location of the panel
public panelClass()
{
InitializeComponent();
}
private void InitializeComponent()
{
this.BackColor = System.Drawing.SystemColors.ControlDark;
this.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
this.Size = new System.Drawing.Size(50, 50);
this.TabIndex = 0;
}
How can I control the Location of it!?!
Thanks very much, Sérgio
|
|
|
|
|
Why can't you just do
panelClass panelCenas = new panelClass();<br />
<br />
panelCenas.Location = new Point(50,05);
Why do you need the extra variables?
Michael
CP Blog [^]
|
|
|
|
|
thanks you, Michael....
newbie thing
|
|
|
|
|
This is other stupid doubt
What I want to do is sometinhg like that
panelClass panelCenas = new panelClass(Location, Size, backgruondColor, etc...);
In order to do that, what I have to do in the panelClass?!
I have to erase that?!
public panelClass()
{
InitializeComponent();
}
private void InitializeComponent()
{
this.AllowDrop = true;
//this.Anchor = ((System.Windows.Forms.AnchorStyles)((System.Windows.Forms.AnchorStyles.Left | System.Windows.Forms.AnchorStyles.Right)));
this.AutoScroll = true;
this.BorderStyle = System.Windows.Forms.BorderStyle.Fixed3D;
}
Thanks you
|
|
|
|