|
I have searched for last 2 months the C++/CLI programming book in few public university but what I can find are books on native c++ maybe mixed with part of the C++/CLI and C#. If want to use .NET Framework it is better look for C# as reference.
|
|
|
|
|
Q1:
enum class Instrution{sit, sleep, jog, nullptr};
ref class DataPack{
public: Instruction^ xxx;
DataPack(array<Byte>^ data){
this->xxx = safe_cast<instruction^>(BitConvert::ToInt32(data, 0));
}
};
I create an object of the ref class DataPack in ref class Form1:
array<Byte>^ byData = gcnew array<Byte>(1024);
DataPack^ DataRecv = gcnew DataPack(byData);
switch(DataRecv->xxx) {}
2 error occur:
(1)error C2682: cannot use 'safe_cast' to convert from 'int' to 'DataPack::Instruction ^' (happen in ref class DataPack)
(2)error: illegal type of switch statement.(happen in ref class Form1)
I think main cause is due to the error(1). Whats wrong with my casting? Reference to c# this.xxx = (Instruction)BitConvert::ToInt32(data, 0); work properly.
Q2:
List<Byte>^ result = gcnew List<Byte>();
result->AddRange(BitConverter::GetBytes((int)xxx));
error C2664:'System::Collections::Generic::List<t>::AddRange': cannot convert parameter 1 from 'cli::array <type>^' to 'System::Collections::Generic::IEnumerable<t>^'
What is about 'IEnumerable<t>? Any example for understanding? The above usage of list::AddRange is reference to the c# but not work that way in c++/cli.
Thanks..
modified on Tuesday, March 18, 2008 4:43 AM
<div class="ForumMod">modified on Tuesday, March 18, 2008 4:46 AM</div>
|
|
|
|
|
It's really difficult to decipher your post, but I'll take a crack at Q1.
The error messages pretty much explain the errors. You can't convert an Int32 to an enum^.
You also can't switch on an enum^.
You can't use the nullptr keyword in the enumeration.
Use your enumeration like an enumeration - you don't create handles to them on the GC heap.
Maybe this is what you wanted:
enum class Instruction {sit, sleep, jog};
ref class DataPack
{
public:
Instruction xxx;
DataPack(array<Byte>^ data)
{
this->xxx = safe_cast<Instruction>(BitConverter::ToInt32(data, 0));
}
};
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Err...what you mean by decipher my post? Is that about my question expression hard to understand or something else? Anyway, I am sorry. Just tell me what should I do to improve. Thank you.
|
|
|
|
|
Unknown types/classes, case sensitivity, etc. I re-read it many times and deduced the types as well as I could, mostly
based on the error messages.
Actual pasted code is much easier to work with than pseudocode, but that's just me.
Unless maybe that wasn't C++?
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Is there any method in BCL which eliminates the Duplicate items from a listbox?
I am using C++/CLI in Visual Studio 2008..
Or do I have to specifically write a method for it??
|
|
|
|
|
Don't cross post, it is rude. Your question has been already answered in C# forum.
Giorgi Dalakishvili
#region signature
my articles
#endregion
|
|
|
|
|
|
Hi,
I am creating a treeview,like Solution Explorer. I done the linking of current file. Now what i want is, it will check the function syntax based on that it will generate the treenode automatically . can you give me some sample code.
|
|
|
|
|
Hi All,
The only thing I can say is I am missing something... Can anyone bail me out.
Thanks,
Jeff
array<Byte>^ key = { ... };
array<Byte>^ encrypted = { ... };
...
pin_ptr<Byte> pk = const_cast< interior_ptr<Byte> >(key);
pin_ptr<Byte> pe = const_cast< interior_ptr<Byte> >(encrypted);
bool result = Decrypt( pk, key->Length, pe, encrypted->Length );
|
|
|
|
|
Found it...
Jeffrey Walton wrote: const_cast< interior_ptr<byte> >(key);
const_cast< interior_ptr<Byte> >(&key[0]);
Jeff
|
|
|
|
|
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.
|
|
|
|