Re: dealing with unsigned char* from C++ .lib
- From: "Stephen Cawood" <cawood@xxxxxxxxxx>
- Date: Wed, 31 May 2006 17:12:41 GMT
thanks for the message, here are some more details.
this code is in my C++ wrapper, it includes a description of the function
and it writes the image out to a file. I was using it to test that the
wrapper was accessing the lib properly. I'd like to be able to do the same
from C#.
//-Call create() to create a bitmap of (10*scale) x (*10*scale) bytes
//create() will fill an unsigned char array with 100*scale*scale bytes
//
//create ID=567, 5 pixels/bit, total image will be 50x50 pixels
//this function will malloc room if image is NULL
//returns -1 if problem, 0 otherwise
//create() will fill an unsigned char array with 100*scale*scale bytes
WIN32DLL_API int create_wrapped(int id, int scale, unsigned char *image)
{
// This code writes the image out to a .PGM file
create(id, scale, image);
char *file_name = "test.pgm";
char *comment = "createimage";
int width = 10*scale;
int height = 10*scale;
FILE *out;
int i,j;
out=(FILE*)fopen(file_name,"wb");
if(out==NULL)
{printf("PGM_FUNCTIONS.C error: Couldn't open %s for
writing\n",file_name);exit(1);}
fprintf(out,"P5\n#%s\n",comment);
fprintf(out,"%d %d\n255\n",width,height);
for(i=0;i<width*height;i++)
{
j=(int)(*(image+i));
fputc(j,out);
}
fclose(out);
return create(id, scale, image);
}
"Nicholas Paldino [.NET/C# MVP]" <mvp@xxxxxxxxxxxxxxxxxxxxxxxxxxx> wrote in
message news:ulxI3KNhGHA.4368@xxxxxxxxxxxxxxxxxxxxxxx
Stephen,
Does the function allocate the memory for the bytes? My guess is that
it doesn't. Otherwise, you would have a double reference to byte in the
unmanaged declaration.
However, it doesn't seem to have a mechanism to allow you to specify
how big the buffer is that you are passing to it. This is important,
since you don't want the API function to overwrite memory that does not
belong to it.
Before I give an answer, can you show how you would call this
(including the code to set up any variables you are passing, as well as
how you would interpret or clean up those variables when done)? This way,
we can indicate what you have to do.
--
- Nicholas Paldino [.NET/C# MVP]
- mvp@xxxxxxxxxxxxxxxxxxxxxxxxxxx
"Stephen Cawood" <cawood@xxxxxxxxxx> wrote in message
news:uwjfg.220$I61.137@xxxxxxxxxxx
I'm trying to use a C++ .lib from C# (I tried the Interop group will no
results).
I have a working wrapper DLL (I can get back simple things like int), but
I'm having issues dealing with an array of bytes.
For example, the .lib contains this function:
int create(int id, int scale, unsigned char *image);
In the wrapper DLL I have this function:
WIN32DLL_API int create_wrapped(int id, int scale, unsigned char *image)
{
return create(id, scale, image);
}
I also tried to return the unsigned char* like this:
WIN32DLL_API int create_wrapped_returnimage(int id, int scale, unsigned
char *image)
{
create(id, scale, image);
return image;
}
In C#, I've tried to access the functions like this:
[DllImport("Win32DLL.dll", EntryPoint="create_wrapped")]
public static extern int create_wrapped(int id, int scale,[In, Out]
IntPtr image);
[DllImport("Win32DLL.dll", EntryPoint="create_wrapped_returnimage")]
public static extern IntPtr create_wrapped_returnimage(int id, int
scale,[In] IntPtr image);
Then I try to manage the array like this:
IntPtr ptrArg = new IntPtr();
IntPtr unmanagedArray = create_wrapped_returnimage(0,5,ptrArg);
byte [] newArray = new byte[500];
Marshal.Copy(unmanagedArray, newArray, 0, 500);
I then checked what I have and get an error that this returns null:
label1.Text = unmanagedArray.GetType().ToString();
Eventually, I'll be converting the original byte array into an image, but
clearly I need to get this working first. I've tried various data types
to try and deal with the "unsigned char *image," but I haven't found a
solution.
Can someone suggest the best way to deal with this? Should I be
converting the unsigned char to a different type within the C++ wrapper
function? If so, some sample code would be helpful.
Thanks in advance.
.
- References:
- dealing with unsigned char* from C++ .lib
- From: Stephen Cawood
- Re: dealing with unsigned char* from C++ .lib
- From: Nicholas Paldino [.NET/C# MVP]
- dealing with unsigned char* from C++ .lib
- Prev by Date: Re: Passing values between forms
- Next by Date: Fetching data from SQL Server
- Previous by thread: Re: dealing with unsigned char* from C++ .lib
- Next by thread: Fetching data from SQL Server
- Index(es):
Relevant Pages
|