|
Out of curiosity, why the const_cast?
What about
pin_ptr<Byte> pk = &key[0];
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Hi Mike,
Thanks. That works too.
I don't have any CLI books, so I was working off of Nishant's online book (chapter 4 if I recall). I believe I was incorrectly adapting pinning string buffers.
Can you recommend any good CLI books? I wrote to Richter asking him for something similar to CLR via C#. He was working on a book Stan Lippman to "port" his CLR via C# to C++/CLI, but it didn't work out.
Jeff
|
|
|
|
|
Jeffrey Walton wrote: Hi Mike
Please, call me Mark hehe
Nish's book is the only one I know of (and I don't have it unfortunately).
The only managed C++ book I have on my shelf is
"Programming with Managed Extensions for Microsoft Visual C++ .NET"
by Richard Grimes.
It's occasionally a good reference, but now that I don't use managed extensions
(VS 2003 .NET) I don't use it much anymore
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Hi Mark,
Mark Salsbery wrote: Please, call me Mark hehe
Don't I fell like the horse's ass...
Mark Salsbery wrote: Nish's book is the only one I know of (and I don't have it unfortunately).
I will pick it up shortly. At minimum, it will be support for a valuable CodeProject member.
I'll write to Richter again to try an nudge him along. I'm not above begging
Jeff
|
|
|
|
|
1st I dont have any idea if my question fits into this catagory or not? f not then really sorry friends. however my question is "Can i reuse a C/C++ code into any .Net application using C#?"
(Jameel)
|
|
|
|
|
If it is written in managed c++ then it can be used from any .NET language.
|
|
|
|
|
To use the code with the least amount of modification, you can use C++/CLI (managed C++) to
bridge the gap between the native code and the managed .NET world.
A .NET assembly from C++/CLI will be usable from C# assemblies.
There is a learning curve, its size depending on how much you know about .NET
A first look at C++/CLI[^]
This message board is a good place to get help if you choose to go that route
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Thanx for the help Mark and Giorgi 1 thing more plz. Which 1 could be the easy way to convert my code into a managed code? what about VC++ 2005?
(Jameel)
|
|
|
|
|
How easy it is depends on how well you know managed code and .NET.
I would say the easiest thing to do is wrap your unmanaged/native code
in managed class wrappers.
A search in the articles here at Code Project should yield all kinds of examples.
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
If done in managed C++, then yes. You can do unmanaged but it is a bit trickier...
"I guess it's what separates the professionals from the drag and drop, girly wirly, namby pamby, wishy washy, can't code for crap types." - Pete O'Hanlon
|
|
|
|
|
[StructLayout(LayoutKind::Sequential, Pack=1, CharSet=CharSet::Ansi)]
ref struct MyStruct
{
[MarshalAs(UnmanagedType::ByValArray, SizeConst=1024 )]
array<byte>^data;
};
///////////////////////
array<byte> ^Serialize(MyStruct ^Struct)
{
int len=Marshal::SizeOf(Struct);
IntPtr ptr=Marshal::AllocHGlobal(len);
array<byte>^ rawdatas = gcnew array<byte>(len);
try
{
Marshal::StructureToPtr(Struct,ptr,false);
Marshal::Copy( ptr, rawdatas, 0, len );
Marshal::FreeHGlobal( ptr );
//////////////////////////////////////////////////////////////////
return rawdatas;
}
catch(ArgumentException ^e)
{
MessageBox::Show(e->Message);
}
return rawdatas;
}
//////////////
Error in StructureToPtr:
Type could not be marshaled because the length of an embedded array instance does not match the declared length in the layout.
|
|
|
|
|
Please format your posted code in a readable and compilable fashion!!
Use the pre tags and fix the <> brackets!
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
[StructLayout(LayoutKind::Sequential, Pack=1, CharSet=CharSet::Ansi)]
ref struct MyStruct
{
[MarshalAs(UnmanagedType::ByValArray, SizeConst=1024 )]
array<Byte>^data;
};
///////////////////////
array<Byte> ^Serialize(MyStruct ^Struct)
{
int len=Marshal::SizeOf(Struct);
IntPtr ptr=Marshal::AllocHGlobal(len);
array<Byte>^ rawdatas = gcnew array(len);
try
{
Marshal::StructureToPtr(Struct,ptr,false);
Marshal::Copy( ptr, rawdatas, 0, len );
Marshal::FreeHGlobal( ptr );
//////////////////////////////////////////////////////////////////
return rawdatas;
}
catch(ArgumentException ^e)
{
MessageBox::Show(e->Message);
}
return rawdatas;
}
//////////////
Error in StructureToPtr:
Type could not be marshaled because the length of an embedded array instance does not match the declared length in the layout.
|
|
|
|
|
If you add < PRE> tags as Mark suggested, I might actually look at your code...
They tend to preserve indentation, making things much easier to read.
Luc Pattyn [Forum Guidelines] [My Articles]
This month's tips:
- before you ask a question here, search CodeProject, then Google;
- the quality and detail of your question reflects on the effectiveness of the help you are likely to get;
- use PRE tags to preserve formatting when showing multi-line code snippets.
|
|
|
|
|
I don't have any idea how you're actually using this code, but from the error message,
is the number of elements in the data array == 1024 as specified by SizeConst?
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
1)when i declare variable int count = 0; in ref class it show error
cannot declare non-static member in ref class
I solved all relevant errors by putting static in front like this:
static int count = 0;
Will it be any problem in this way?
2) I create a namespace xxx will several class and function in a cpp file then want to use it in namespace form1 ref class form in Form.h file. I put using namespace xxx in it but error come out like this: xxx is not a namespace or cannot find namespace xxx
To do what i want, how is the right way should be?
ps: I know my questions is no standard but pls help to answer it if u willing to, otherwise ignore me. TQ.
|
|
|
|
|
Member 4542272 wrote: 1)when i declare variable int count = 0; in ref class it show error
The error should be something like this:
"error C3845: 'MyRefClass::count': only static data members can be initialized inside a ref class or value type"
Yes, you can solve it by making the variable static, but you get the ramifications of doing so.
There is onle ONE instance of a static class variable, and it is shared by EVERY object of
that class. Is that really what you want?
If not, you should move your initialization to a constructor, in the normal C++ way...
ref class MyRefClass
{
public:
int count;
TestRefClass() {count = 0;}
};
Member 4542272 wrote: 2) I create a namespace xxx will several class and function in a cpp file then
Can you show some sample code? You can't state you're using a namespace if the compiler doesn't
have knowledge of the namespace's existence. The namespace should be in at least one header
file #included in the module(s) you're using it in.
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Ya, your explanation for first question is exactly what i want, thanks.
Here is the sample code for question 2:
Let say in Form1.h hv a ref class Form1: public System::Windows::Forms::Form
i add a xx.h file and make function code inline. In the xx.h file:
namespace Mix{
ref class Meat{
public:
Meat();
void CleanMeat(){};
void CookMeat(){}:
};
enum class Vege {tomato, carrot};
enum class fruit{apple, orange,};
}
then i #include xx.h in the Form1.h and put using namespace Mix; By doing these, can i use the class in namespace Mix at ref class Form1 already?
ps: Can u help me look at the new error question in the c++/cli asynchronous socket thread at about page 4 also?
|
|
|
|
|
Member 4542272 wrote: By doing these, can i use the class in namespace Mix at ref class Form1 already?
I don't see why not
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Member 4542272 wrote: Can u help me look at the new error question in the c++/cli asynchronous socket thread at about page 4 also?
Link? (you can use the permalink button at the bottom of the post to get a direct link copied to your browser's address bar).
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Hi all,
Can any one tell me the simplest method of coding a program that is used to identify the internal default values i.e.,if those attributes are not declared in given program (or declared but not assigned a value) then the attribute should be printed to a text file?
my mail: angella_sara@yahoo.co.in
Thanks in advance..
Angella
|
|
|
|
|
You want to write a program that examines a different program for what variables it has ? In C++/CLI, you may be able to do this for other .NET programs, using reflection. For normal C++ apps, not at all possible.
Christian Graus - Microsoft MVP - C++
"also I don't think "TranslateOneToTwoBillion OneHundredAndFortySevenMillion FourHundredAndEightyThreeThousand SixHundredAndFortySeven()" is a very good choice for a function name" - SpacixOne ( offering help to someone who really needed it ) ( spaces added for the benefit of people running at < 1280x1024 )
|
|
|
|
|
Angella wrote: identify the internal default values i.e.,if those attributes are not declared in given program
What? If they aren't declared then they don't exist and therefore can't have any value?
led mike
|
|
|
|
|
Hello,
I am wrapping a regular dll file using C++/CLI.
One of the methods that wrap have the following signature:
<br />
template <class t=""><br />
void Vector<t>::push_back(const T& new_item)<br />
</t></class>
when in my case T is of type Behavior*
When doing the following thing:
<br />
...<br />
Behavior* myB;<br />
...<br />
push_back(myB);<br />
I receive error C2664: 'Vector<t>::push_back' : cannot convert parameter 1 from 'Behavior *' to 'Behavior *const &'
Even if I explicitly cast myB to const it does not help.
What am I doing wrong ?
Thanks,
Efi
|
|
|
|
|
Efi Merdler wrote: void Vector::push_back(const T& new_item)
assuming you posted that accurately the parameter type is "const T&" not "const T*"
led mike
|
|
|
|