|
[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
|
|
|
|
|
Thanks.
T for me is Behavior* so the method signature is
push_back(const Behavior*& item)
Correct me if I'm wrong (probably I am) when using & in method declaration it means by ref.
I do not really understand what kind of type push_back accepts. I can not declare variable of type
Behavior*&
Efi
|
|
|
|
|
Efi Merdler wrote: Correct me if I'm wrong (probably I am) when using & in method declaration it means by ref.
Yes.
Efi Merdler wrote: I do not really understand what kind of type push_back accepts. I can not declare variable of type
Behavior*&
<foo*> vector<foo*> vfoo;
vfoo.push_back( new foo(10));
</foo*> <foo*>
led mike
|
|
|
|
|
Thank you for the quick reply.
<br />
vector<foo*> vfoo;<br />
foo* f = new foo(10);<br />
vfoo.push_back(f);</foo*>
It looks exactly like I wrote at the beginning.
For me vector is defined for Behavior*.
Sorry I do not understand.
Efi
|
|
|
|
|
Efi Merdler wrote: It looks exactly like I wrote at the beginning.
Have you looked at your posts? the '<' and '>' characters are not posting. You need to follow the direction on the page for posting those characters.
The code I posted compiles that's why I posted it, complete with '<' and '>' characters. I still have not seen your code yet so I can't really comment on that. But the code I posted works.
led mike
|
|
|
|
|
Here is method signature
template <class T>
void Vector<T>::push_back(const T& new_item)
I initialize the Vector class with T = Behavior*
When running push_back I receive the error I mentioned in my first post.
I hope it's better now.
Thanks you,
Efi
|
|
|
|
|
Efi Merdler wrote: Here is method signature
template <class t="">
void Vector<t>::push_back(const T& new_item)
I don't need you to post the code from the STL, i've seen it. What I have not seen is your declaration of your vector. Do you see how the code I posted includes the declaration of the vector?
vector<foo*> vfoo;
I don't have your Behavior class but the vector doesn't care about any of that. To the vector my foo class pointer is not different from your Behavior class pointer in it's ability to contain pointers to them. You are obviously doing something wrong in code you have not posted.
led mike
|
|
|
|
|
Vector<Behavior*> m_vecSequentialBehaviors; --> defined in regular c++ file.
The vector class is defined inside a regular c++ file (I export it from a dll I created).
The code that I posted earlier in my posts is taken from a CLI project.
When using the push_back method in a regular vc6 project (no CLI) with an argument of type Behavior* I receive no errors. it only happens in the CLI project (VS2005).
Efi
|
|
|
|
|
Efi Merdler wrote: The vector class is defined inside a regular c++ file (I export it from a dll I created).
The code that I posted earlier in my posts is taken from a CLI project.
Not part of your problem but that is a poor design. The actual vector in the DLL should be encapsulated in the interface that is exported from the DLL, not exposed from the interface exported by the DLL.
Efi Merdler wrote: it only happens in the CLI project (VS2005).
Your problem may be that your project is not configured properly. Try declaring a vector in the CLI project and using it as a test to see if it's set up correctly.
led mike
|
|
|
|
|
Hello
I want To create Server , Client Application With Send ,Recive Struct .
i Want work with TcpClient and Send Struct .
........................
|
|
|
|
|
|
I have a C++ win32 console application (built using Visual Studio 2005). I have complete code. I need to convert this console application to a dll and I want to call this DLL in a ASP.Net web service (Just because I know how to create an ASP.Net webservice). I am totally new to C++ programming but now I am getting better at it.
I have successfuly created the DLL of that console app (by changing project properties)and also imported the DLL function successfuly. I can debug the dll code when called from my C#/C++ managed console app (I have tried both C++ and C#).
The problem is when ever the code in DLL uses a std::vector, or any other STL based contianers. The code gives exception i.e.
An unhandled exception of type 'System.AccessViolationException' occurred in C++ManagedConsole.exe
Additional information: Attempted to read or write protected memory. This is often an indication that other memory is corrupt.
can someone please point me to a possible solution for this problem. Though I have the code but I cant just remove all the code using the std::vector, or other containers.
Thanking in advance for any kind of hints.
|
|
|
|
|
s.m.shah wrote: can someone please point me to a possible solution for this problem.
Well we would have to know what the problem is to point to any solutions.
It might have helped if you had posted code showing how you use the vector(s) and what specific line of code throws the exception.
led mike
|
|
|
|