|
Yes, yes, yes! I have verified this by making a copy of the board.cs file and renaming it board.cpp. Then I included it into the VS solution and remarked out all of the code. The I unremarked the code compiling as I went. Propblems did not occur until the line...
PrintPage += gcnew PrintPageEventHandler(PrintableBoard_PrintPage);
I had tried ...
PrintPage += gcnew PrintPageEventHandler(PrintableBoard_PrintPage);
PrintPage += gcnew PrintPageEventHandler(this, PrintableBoard_PrintPage);
PrintPage += gcnew PrintPageEventHandler(&PrintableBoard_PrintPage);
PrintPage += gcnew PrintPageEventHandler(this, &PrintableBoard_PrintPage);
PrintPage += gcnew PrintPageEventHandler(Namespace::PrintableBoard::PrintableBoard_PrintPage);
PrintPage += gcnew PrintPageEventHandler(&Namespace::PrintableBoard::PrintableBoard_PrintPage);
PrintPage += gcnew PrintPageEventHandler(this, Namespace::PrintableBoard::PrintableBoard_PrintPage);
but I missed...
PrintPage += gcnew PrintPageEventHandler(this, &Namespace::PrintableBoard::PrintableBoard_PrintPage);
Which is the correct syntax because now it will compile. The other combinations just give similar error messages.
Thanks a lot, chances are that I would not have gone back and realized that there was one combination of arguments that I had not tried.
Buck
|
|
|
|
|
Hi Buck,
the fact is I never did any C++/CLI so I gave it a single try which obviously
failed, then read the MSDN page on Paint event, and copied what was in the example.
It is good to do some experiments, it is even better to combine them with
reading some documentation. And when new at a language it really pays to buy
and study a book on it (I have the book, just haven't read it yet).
Luc Pattyn [Forum Guidelines] [My Articles]
this weeks tips:
- make Visual display line numbers: Tools/Options/TextEditor/...
- show exceptions with ToString() to see all information
- before you ask a question here, search CodeProject, then Google
|
|
|
|
|
Hi Luc,
Trust me, I spend half my day reading documentation. I do have a little issue that may be a circular dependency. Taking the Sokoban projects Board.cs file and modifying it to be C++ code I have remarked out the guts of the functions and everything compiles just fine. In the 'Board' class there is a function named
public: void Print() {
PrintDocument^ printDoc = gcnew PrintableBoard(this) // unremark out this one line
};
The class 'PrintableBoard' is defined after the 'Board' class. If I leave the single line in the Print() function I get an "error C2061: syntax error : identifier 'PrintableBoard'". Is this a C++ vs. C# issue?
Thanks
Buck
|
|
|
|
|
Okay, I had been trying to use a forward declaration with no luck but I must have gotten the location of the forward decalration in the right place because now it will compile.
Buck
|
|
|
|
|
So I can ignore both messages then?
I am unaware of any circular reference stuff, I never had such a problem in C#;
I do recall C needed forward declarations once in a while, I trust C++ is the same.
Luc Pattyn [Forum Guidelines] [My Articles]
this weeks tips:
- make Visual display line numbers: Tools/Options/TextEditor/...
- show exceptions with ToString() to see all information
- before you ask a question here, search CodeProject, then Google
|
|
|
|
|
Hi Buck,
I just learned C++ needs two arguments ina delegate constructor, the first one
being "this".
The following code compiles:
namespace test3 {
using namespace System;
using namespace System::ComponentModel;
using namespace System::Collections;
using namespace System::Windows::Forms;
using namespace System::Data;
using namespace System::Drawing;
using namespace System::Drawing::Printing;
public ref class PD : public System::Drawing::Printing::PrintDocument {
public:
PD(void) {
this->PrintPage+=gcnew PrintPageEventHandler(
this, &test3::PD::pdm);
}
void pdm(Object^ sender, PrintPageEventArgs^e) {
}
};
}
That's my longest C++/CLI program ever. Hope it helps.
Luc Pattyn [Forum Guidelines] [My Articles]
this weeks tips:
- make Visual display line numbers: Tools/Options/TextEditor/...
- show exceptions with ToString() to see all information
- before you ask a question here, search CodeProject, then Google
|
|
|
|
|
Hi,
I have an application in C# which allocates 200MB of data from the unmanaged heap using the
[DllImport("kernel32")]
static extern void* HeapAlloc(int hHeap, int flags, int size);
I have another fucntion
[DllImport("cppwrapper.dll")]
private extern static int test(IntPtr DataOut, out string ErrorOut);
I want to pass the the pointer returned by HeapAlloc into the test function using the parameter DataOut instead of string as I run into OutofmemoryException randomly(There is a limitation on the managed heap). But I am constantly getting the system.accessviolation exception.
The body of test method looks like
SOME_API int test(LPSTR* DataOut, LPSTR* ErrorOut)
{
return _lpsomefunction(DataOut, ErrorOut);
}
Can someone guide me in the right direction...
|
|
|
|
|
Hi,
it would be more accurate to use:
[DllImport("kernel32")]<br />
static extern IntPtr HeapAlloc(IntPtr hHeap, int flags, int size);
since both hHeap and the return value are pointers (hence 4B on Win32 and 8B on Win64,
exactly what IntPtr gives you).
As such you can pass the return value to your test method.
But then I am puzzled as to why you would use HeapAlloc at all.
You could allocate a byte array of the same size, and use GCHandle class
to "pin" it in memory, then get its pointer (which is an IntPtr obviously).
That way you get managed memory that will not move, and will live until
you Free the GCHandle.
Luc Pattyn [Forum Guidelines] [My Articles]
this weeks tips:
- make Visual display line numbers: Tools/Options/TextEditor/...
- show exceptions with ToString() to see all information
- before you ask a question here, search CodeProject, then Google
|
|
|
|
|
Hi Luc,
Is this the C# board now?
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Sorry if this bothered you. Since there was some C++ involved in the problem so I posted this question.
|
|
|
|
|
No problem I was just giving Luc a hard time.
Cheers,
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Hi Mark,
no we are not colonizing the C++/CLI forum ; I just copied and improved two lines
of code from the OP and introduced some .NET stuff that exists for all CLR
languages AFAIK.
If, however I had known at that time that the identical question was posted
in the C# forum, I would have answered it there (identically). As it is, I told him
overthere not to duplicate stuff...
Please feel free to adjust whatever I may have messed up language wise.
Luc Pattyn [Forum Guidelines] [My Articles]
this weeks tips:
- make Visual display line numbers: Tools/Options/TextEditor/...
- show exceptions with ToString() to see all information
- before you ask a question here, search CodeProject, then Google
|
|
|
|
|
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Thanks a lot for the reply.
I will try and see if it works.
|
|
|
|
|
Sometimes I have to allocate more than 500 MB of data. In such situations I run into OutOfMemoryException.
The real problem here is a third party API I am using expects string as an input parameter which can sometimes be as large as 800 MB.
That why I am using HeapAlloc. HeapAlloc has worked fine for me so far without any problems.
|
|
|
|
|
OK
I hope you don't forget to release that memory eventually...
You probably should make a managed object that allocates, pins, provides the
pointer, and has a Dispose/finalizer/destructor to make sure it gets freed too.
You might want to look at the LP_Pinner class in my TrayIconBuster article.
Luc Pattyn [Forum Guidelines] [My Articles]
this weeks tips:
- make Visual display line numbers: Tools/Options/TextEditor/...
- show exceptions with ToString() to see all information
- before you ask a question here, search CodeProject, then Google
|
|
|
|
|
I do a HeapFree everytime. Actually I am running this on a Grid environment with 1000's of items and each item is memory intensive and each item sometimes goes beyond 1.5 GB. But after every run the memory comes back to 60 mb or so.
I will try whatever you said.
Thanks again for all the valuable information.
|
|
|
|
|
This is purely a guess on my part, but perhaps you might consider using VirtualAlloc instead of HeapAlloc ?
Maybe the VirtualAlloc will be able to provide all the memory you need without OutOfMemory exceptions.
--------------------------------
"All that is necessary for the forces of evil to win in the world is for enough good men to do nothing" -- Edmund Burke
|
|
|
|
|
1. I am writing a program to access parallel port in Windows XP.
2. taking help from net i found a program called UserPort which opens ports.
3. Using a small program in C using stdio and conio include files i could access the port.
4. However the problem is i have to write code in C++ and when i try to compile the same code in C++ as a .cpp file the compiler gives an error saying "_outp undeclared " and " sleep undeclared". the sme code compiles properly in c using same IDE.
5. I am using Dev-C++ 4.9.9.2. I cant use any other compiler.
6. My code is given below as a c file
/*********************************************
binary counter : This will count from 0 to 255 This takes printer port address as 0x378 and pauses for 250 mS between every count
**********************************************/
#include <stdio.h>
#include <conio.h> /*required for _outp*/
int main()
{
int x;
for(x = 0;x<=255;x++)
{
_outp(0x378,x);
sleep(250);
}
return 0;
}
7. Pl help. Its urgent.
Shaleen Singh
-- modified at 14:44 Wednesday 15th August, 2007
|
|
|
|
|
I'm not sure why you'd post this on a Managed Visual C++ message board.
In Visual C++, the CRT function _outp() is declared in <conio.h>
I can't see what header files you've included in your code.
There's a Sleep() (with a capital S) Windows API
Mark
Mark Salsbery
Microsoft MVP - Visual C++
|
|
|
|
|
Mark Salsbery wrote: I'm not sure why you'd post this on a Managed Visual C++ message board.
Liar
|
|
|
|
|
|
Hi
I don't know the answer to Shaleen's question but I have a question of my own.
1. I'm also writing a program for parallel port communication in Win XP. I've used the code in http://www.codeproject.com/system/AsefPortAccess.asp as a guideline.
2. When running the program, the line "_outp(0x378, iByte);" gives an error. On debugging I tracked the error to the assembly code line "1022CC4B out dx,al" which gives the error "Unhandled exception in ParallelComm.exe (MSVCRTD.DLL): 0xC0000096: Privileged Instruction."
I'd appreciate it if someone could help me out here
mirispearl
|
|
|
|
|
hi,
when I tried to compile the following simple C++ program,
#include<iostream.h>
main()
{
cout << "Hello World!";
return 0;
}
got the error as
In file included from /usr/lib/gcc/i386-redhat-linux/3.4.3/../../../../include/c++/3.4.3/backward/iostream.h:31,
from hello.cpp:1:
/usr/lib/gcc/i386-redhat-linux/3.4.3/../../../../include/c++/3.4.3/backward/backward_warning.h:32:2: warning: #warning This file includes at least one deprecated or antiquated header. Please consider using one of the 32 headers found in section 17.4.1.2 of the C++ standard. Examples include substituting the <X> header for the <X.h> header for C++ includes, or <iostream> instead of the deprecated header <iostream.h>. To disable this warning use -Wno-deprecated.
/tmp/cc3RakqC.o(.text+0xd): In function `std::__verify_grouping(char const*, unsigned int, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)':
: undefined reference to `std::basic_string<char, std::char_traits<char>, std::allocator<char> >::size() const'
/tmp/cc3RakqC.o(.text+0x60): In function `std::__verify_grouping(char const*, unsigned int, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)':
: undefined reference to `std::basic_string<char, std::char_traits<char>, std::allocator<char> >::operator[](unsigned int) const'
/tmp/cc3RakqC.o(.text+0x9d): In function `std::__verify_grouping(char const*, unsigned int, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)':
: undefined reference to `std::basic_string<char, std::char_traits<char>, std::allocator<char> >::operator[](unsigned int) const'
/tmp/cc3RakqC.o(.text+0xc8): In function `std::__verify_grouping(char const*, unsigned int, std::basic_string<char, std::char_traits<char>, std::allocator<char> > const&)':
: undefined reference to `std::basic_string<char, std::char_traits<char>, std::allocator<char> >::operator[](unsigned int) const'
/tmp/cc3RakqC.o(.text+0x121): In function `main':
: undefined reference to `std::cout'
/tmp/cc3RakqC.o(.text+0x126): In function `main':
: undefined reference to `std::basic_ostream<char, std::char_traits<char> >& std::operator<< <std::char_traits<char> >(std::basic_ostream<char, std::char_traits<char> >&, char const*)'
/tmp/cc3RakqC.o(.text+0x152): In function `__static_initialization_and_destruction_0(int, int)':
: undefined reference to `std::ios_base::Init::Init()'
/tmp/cc3RakqC.o(.text+0x181): In function `__tcf_0':
: undefined reference to `std::ios_base::Init::~Init()'
/tmp/cc3RakqC.o(.eh_frame+0x11): undefined reference to `__gxx_personality_v0'
collect2: ld returned 1 exit status
I am using cc hello.cpp to compile the program
When I tried with the command g++ hello.cpp,got the message
In file included from /usr/lib/gcc/i386-redhat-linux/3.4.3/../../../../include/c++/3.4.3/backward/iostream.h:31,
from hello.cpp:1:
/usr/lib/gcc/i386-redhat-linux/3.4.3/../../../../include/c++/3.4.3/backward/backward_warning.h:32:2: warning: #warning This file includes at least one deprecated or antiquated header. Please consider using one of the 32 headers found in section 17.4.1.2 of the C++ standard. Examples include substituting the <X> header for the <X.h> header for C++ includes, or <iostream> instead of the deprecated header <iostream.h>. To disable this warning use -Wno-deprecated.
After using g++ hello.cpp for compilation,I ran a.out to see the output,but I got '-bash: a.out: command not found' error.
Please help me out in compiling this.
Regards,
Vasudha
|
|
|
|
|
First of all, you are in the wrong forum. Please ask this type of question in the C++ forum not the C++/CLI (Managed C++) one. I believe you need to use: #include <iostream> rather than #include <iostream.h> , which is deprecated, as the error message suggests. Also, cout is found in the std namespace.
"We make a living by what we get, we make a life by what we give." --Winston Churchill
|
|
|
|
|