|
I am new to Managed C code and I am trying to create a packet class to have a socket and buffer array. If I make the class unmanaged I get this error: error C2365: cannot declare a managed 'thisSocket' in an unmanaged 'CSocketPacket'.
If I make the class managed by adding 'public ref class' The program gets like 43 errors instead of just these. My code is below. Please help me. Thanks.
#include "stdafx.h"
#include "Server.h"
using namespace System;
using namespace System::Text;
using namespace System::IO;
using namespace System::Net;
using namespace System::Net::Sockets;
using namespace System::Collections;
const int portNumber = 1024;
public class CSocketPacket
{
System::Net::Sockets::Socket thisSocket;
array<byte>^dataBuffer = gcnew array<byte>(1024);
};
// Constructor
Server::Server()
{
}
// Destructor
Server::~Server()
{
}
void Server::initServer()
{
socketListener = gcnew Socket( AddressFamily::InterNetwork, SocketType::Stream, ProtocolType::Tcp );
IPEndPoint ipLocal = gcnew IPEndPoint ( IPAddress::Any, portNumber );
socketListener.Bind( ipLocal );
socketListener.Listen(1);
socketListener.BeginAccept( new AsyncCallback(connectCallbackFunction), NULL );
}
void Server::connectCallbackFunction(System::IAsyncResult result)
{
socketWorker = socketListener.EndAccept( result );
WaitForData( socketWorker );
SendData( socketWorker );
}
void Server::WaitFordata(System::Net::Sockets::Socket IOsocket)
{
CSocketPacket packet = new CSocketPacket();
packet.thisSocket = IOsocket;
IOsocket.BeginReceive( packet.dataBuffer, 0, packet.dataBuffer->Length, SocketFlags::None, gcnew AsyncCallback(dataReceivedCallbackFunction), packet);
}
void Server::SendData(System::Net::Sockets::Socket IOsocket)
{
// convert object to byte array
byte[] byteData = System::Text::Encoding::ASCII::get( messageToSend );
// send data
IOsocket.Send ( byteData );
}
void Server::dataReceivedCallbackFunction(System::IAsyncResult result)
{
CSocketPacket packet = (CSocketPacket)result->AsyncState;
int size = packet.thisSocket->EndReceive( result );
char[] buffer = gcnew char[size 1];
System::Text::Decoder decoder = System::Text::Encoding::UTF8::get();
int numCharacters = decoder.GetChars( packet.dataBuffer, 0, size, buffer, 0 );
System::String receivedData = gcnew System::String( buffer );
// print to screen
}
|
|
|
|
|
Do you want the class managed or unmanaged?
For unmanaged, the error message is a good clue - you can't have managed members in an unmanaged
class.
You also can't declare/define/create an object in the class declaration like this:
array^dataBuffer = gcnew array(1024);
System::Net::Sockets::Socket I believe does NOT have a default constructor so you'd need another
way to declare the thisSocket member (probably use a managed pointer).
"Posting a VB.NET question in the C++ forum will end in tears." Chris Maunder
|
|
|
|
|
I would like the class unmanaged. How would I create the thisSocket and have it inside that class or how would I use a managed pointer to do this? Still a little confused.
|
|
|
|
|
Maybe something like this:
class CSocketPacket
{
public:
gcroot<System::Net::Sockets::Socket ^> thisSocket;
gcroot<array<Byte> ^> dataBuffer;
CSocketPacket();
};
...
CSocketPacket::CSocketPacket()
{
thisSocket = 0;
dataBuffer = gcnew array<Byte>(1024);
}
"Posting a VB.NET question in the C++ forum will end in tears." Chris Maunder
|
|
|
|
|
Hi All,
I have another problem with calling manage code from dll.
I do the following:
1. Create dll project in the VS2005, add /clr option under project property->C++->general
2. Add header file to the project with interface:
<br />
#define Base_API __declspec(dllexport)<br />
<br />
class BaseI_SqlDbConnection;<br />
class Base_API Base_SqlDbConnection<br />
{<br />
public:<br />
Base_SqlDbConnection(); <br />
BaseI_SqlDbConnection *m_pi;<br />
};<br />
3. Add define of class to the .cpp file. It is the simple wrapper on the SqlClient.
<br />
using namespace System;<br />
using namespace Data;<br />
using namespace SqlClient;<br />
<br />
#ifdef _MANAGED<br />
#pragma managed(push, off)<br />
#endif<br />
BOOL APIENTRY DllMain( HMODULE hModule,<br />
DWORD ul_reason_for_call,<br />
LPVOID lpReserved<br />
)<br />
{<br />
return TRUE;<br />
}<br />
#ifdef _MANAGED<br />
#pragma managed(pop)<br />
#endif<br />
class BaseI_SqlDbConnection<br />
{<br />
public:<br />
BaseI_SqlDbConnection()<br />
: m_SqlDbConnection(gcnew SqlConnection){}<br />
<br />
gcroot<SqlConnection ^> m_SqlDbConnection;<br />
};<br />
Base_SqlDbConnection::Base_SqlDbConnection() : m_pi(new BaseI_SqlDbConnection)<br />
{<br />
}<br />
4. Call the class from MFC application looking like this:
Base_SqlDbConnection test;
With help of debugger, I found that the BaseI_SqlDbConnection()
constructor doesn't want to call and object m_SqlDbConnection could not be created.
I guess that the problem is in the managed code, but I am newbie for this. Please help
me to resolve the problem or point me to the article about this.
|
|
|
|
|
Hi,
I need to capture a screen image, at first point i dont know which functions to use for a simple screen shot... i need some help for that, but to start with i realy need as i saw in other forums, i could capture a number of triangles or polygons for what is being rendered to the screen, and my question is where to start looking for to do this ???
it is also possible to capture the number of colors that is being rendered ?
Thanks in advance
-- modified at 12:35 Saturday 21st April, 2007
|
|
|
|
|
There are articles on screen capture in C#, these are easily modified to use C++/CLI or managed C++. If you're just in the wrong forum, there are articles on doing it in C++, as well ( in fact, I think they C# ones p/invoke Windows C APIs )
Unless you're in a 3D game ( where screen capture is more difficult ), there are no polygons being rendering on the screen, only pixels. If you want the exact number of colors, you can iterate over a captured bitmap and count them.
Christian Graus - Microsoft MVP - C++
Metal Musings - Rex and my new metal blog
"I am working on a project that will convert a FORTRAN code to corresponding C++ code.I am not aware of FORTRAN syntax" ( spotted in the C++/CLI forum )
|
|
|
|
|
thanks christian,
you know which the best functions to do this with C++ ??
|
|
|
|
|
Please ask in the right forum, first. Also, type 'screen capture C++' into google and you'll find tons of articles on it.
Christian Graus - Microsoft MVP - C++
Metal Musings - Rex and my new metal blog
"I am working on a project that will convert a FORTRAN code to corresponding C++ code.I am not aware of FORTRAN syntax" ( spotted in the C++/CLI forum )
|
|
|
|
|
Hello,
i try for display a file event log list, i use For each;
EventLog^ myLog = gcnew EventLog;<br />
for each (System::Diagnostics::EventLogEntry^ entree in myLog->Entries)<br />
MessageBox::Show(entree->Message);
there are a sam code in C#
System.Diagnostics.EventLog eventLog1;<br />
foreach (System.Diagnostics.EventLogEntry entree in eventLog1.Entries)<br />
{ MessageBox.show(entree.Message);}
There are error: An unhandled exception of type 'System.ArgumentException' occurred in System.dll
Additional information: Log property value has not been specified
Please help me to resolve this great problem
|
|
|
|
|
That is not the same code! The C++/CLI code:
EventLog^ myLog = gcnew EventLog; ,
and the C# code:
System.Diagnostics.EventLog eventLog1;
are different.
"We make a living by what we get, we make a life by what we give." --Winston Churchill
|
|
|
|
|
Hi ,
Why this small C++ code not working ?
Unable to Identify: Pl. Help:
******************************************************
#include <iostream>
#include <string>
#include
#include <vector>
using namespace std;
class c
{
string *cc ;
public:
c(const string& s1):cc(new string(s1)){}
c(const c& k)
{
cc = new string(k.get());
}
string get(){ return *cc;}
~c(){delete cc;}
};
/*
class x
{
vector <c*>cc;
public:
}
*/
int main()
{
c kk("bvls");
cout<<kk.get()<<endl;
c b(kk);
cout<<b.get()<<endl;
c="" ck="b;
cout<<ck.get()<<endl;
return" 0;
}
***********************************************
whats="" the="" mistake="" i="" am="" committing?="" how="" to="" overcome="" it..??
thank="" you="" in="" anticipation.=""
prasad.=""
<div="" class="ForumSig">Programming is Understanding
--Stroustroup
|
|
|
|
|
When you ask this again, in the correct forum ( this is the C++/CLI forum ), define 'not working' so people don't have to run your code to work out what's going wrong.
Christian Graus - Microsoft MVP - C++
Metal Musings - Rex and my new metal blog
"I am working on a project that will convert a FORTRAN code to corresponding C++ code.I am not aware of FORTRAN syntax" ( spotted in the C++/CLI forum )
|
|
|
|
|
I am using Visual C++ 2005 C++/CLI and I want to sort the columns in my listView. There is a Microsoft article from 01/09/2006 (Article ID 816183) that explains exactly how to do it using the ListViewColumnSorter object but this does not work for me because the line 'private: ListViewColumnSorter^ lvColumnSorter' does not compile. Can anyone direct me to any other articles that may provide insight?
Thanks
Buck
Buck Brown
|
|
|
|
|
I beleive I've figure this out. The article has the reader use the class BEFORE the article defines the class! What a back asswards way to describe something. The article should define the classes first THEN show you how to use them.
|
|
|
|
|
I am using Visual Studio 2005 C++/CLI. I am new to CLI and I am using Ivor Horton's book "Beginning Visual C++ 2005". Following the example in the book I get the error in this message's title. I'm thinking that the compiler may not be configured correctly. This is pretty straight forward. Does anyone see what is causing this problem.
-------------------
// Container.h
#pragma once
using namespace System;
ref class Container abstract
{
public:
virtual double Volume() abstract;
virtual void ShowVolume() { Console::WriteLine(L"Volume is {0}", Volume()); }
};
-------------------
// Box.h
#pragma once
#include "Container.h"
ref class Box : Container
{
public:
virtual void ShowVolume() override { Console::WriteLine(L"Box usable volume is {0}", Volume()); }
virtual double Volume() override { return m_Length * m_Width * m_Height; }
Box() : m_Length(1.0), m_Width(1.0), m_Height(1.0) {}
Box(double lv, double wv, double hv) : m_Length(lv), m_Width(wv), m_Height(hv) {}
protected:
double m_Length;
double m_Width;
double m_Height;
};
---------------------------------
// Ex9_14.cpp : main project file.
#include "stdafx.h"
#include "Box.h"
using namespace System;
int main(array<system::string ^=""> ^args)
{
array<box^>^ boxes = gcnew Box(); // without this line the app builds just fine
Console::WriteLine(L"Hello World");
return 0;
}
Thanks in advance.
Buck
|
|
|
|
|
What is "array"?
Never mind - I was looking at Managed Extensions
Did you want an array of Boxes?
Something like this..
array<Box ^> ^boxes = gcnew array<Box ^>(10);
Mark
-- modified at 16:26 Thursday 19th April, 2007
"Posting a VB.NET question in the C++ forum will end in tears." Chris Maunder
|
|
|
|
|
I took the example code and stipped it down for simplicity but in the process I broke the code. The actual code looks like this,
array<box^>^ boxes = { gcnew Box(1.0, 2.0, 3.0), gcnew Box(3.0, 4.0, 5.0)};
This initializes two Box objects and when written this way it does compile. I will look at my original app to see how I am initializing my stuff. I must be initializing my array incorrectly.
Thanks
|
|
|
|
|
Are the <> signs being stripped in your posts?
array^ boxes = { gcnew Box(1.0, 2.0, 3.0), gcnew Box(3.0, 4.0, 5.0)};
shouldn't compile.
array<Box ^>^ boxes = { gcnew Box(1.0, 2.0, 3.0), gcnew Box(3.0, 4.0, 5.0)};
works fine.
Mark
"Posting a VB.NET question in the C++ forum will end in tears." Chris Maunder
|
|
|
|
|
Okay, the initialization is working for me now. This all started yesterday when I begain getting a LINK error concerning the virtual override function. Then I started commenting out the bulk of the code (my app has quite a few variable to initialize). Right now it seems to be using the abstract class and the override function in the derived class correctly with no errors. I will proceed by adding one initializing variable at a time and then test it.
Thanks again,
Buck
|
|
|
|
|
I have created an MFC ActiveX Control through the wizard. In the 2nd Step of the wizard I have enabled the checkbox saying “Available in Insert Object Dialog”, so that I can use my control in Microsoft Office Application like MS Word, Excel, PowerPoint etc using Insert Objects.
I am using property sheet to change the text contents of my control. For that I followed the steps mentioned the MSDN Example CIRC.
http://msdn2.microsoft.com/en-us/library/c6hzbzz6(VS.80).aspx
My control features the following characteristics.
• Changing the painting behavior of an ActiveX control
• Adding stock properties
• Adding custom properties
• Responding to mouse events
• Adding custom events
• Using text and fonts
• Implementing ActiveX control property pages
• Using simple data binding for control properties
But at present I am stuck up problems.
1. Using property sheet I can update the text contents in ActiveX test container. But it doesn’t get updated in Word, and other Office Applications. In fact its not even recognizing any of the event fired by the user (like changing the color on mouse click, key press etc) in any of the office application.
2. I am using this control for assigning digital signatures to a document. For that I am using X509 libraries. But these libraries use Common Language Runtime (/CLR) Support. And if I enable CLR from the project settings, the control crashes while loading on the Office application, ultimately crashing the entire document.
|
|
|
|
|
I don't see anywhere that you say you're using C++/CLI ? Try asking in the Visual C++ forum.
Christian Graus - Microsoft MVP - C++
Metal Musings - Rex and my new metal blog
"I am working on a project that will convert a FORTRAN code to corresponding C++ code.I am not aware of FORTRAN syntax" ( spotted in the C++/CLI forum )
|
|
|
|
|
I am using C++/CLI 2005. I have a 'for each' loop to access each element in an array. I would like to access the array index number within the loop but there doesn't appear to be any function that will return the index value. Can this be done?
Buck
|
|
|
|
|
No, you have to keep track of it yourself.
array<String^>^ names = {L"George", L"John", L"James"};
int index = 0;
for each (String^ name in names)
{
Console::WriteLine(L"{0}[{1}]", name, index++);
}
"We make a living by what we get, we make a life by what we give." --Winston Churchill
|
|
|
|
|
foreach is just syntactic sugar, it just generates a for loop. Use a for loop if you need the index.
Christian Graus - Microsoft MVP - C++
Metal Musings - Rex and my new metal blog
"I am working on a project that will convert a FORTRAN code to corresponding C++ code.I am not aware of FORTRAN syntax" ( spotted in the C++/CLI forum )
|
|
|
|