Pointer

S

Sheikko

Hi, friends. I am new in this group and I have a problem. I am just
started to program in cSharp and I need a help.
I need to import a ddl and to use one of its function. The function, in
C language, require in input a pointer char:

OpenFile(char* filename);

To use this function in cSharp I have writing the following code:
=============================================
[DllImport("My.dll")]
unsafe public static extern int OpenFile(char* filename);
......
unsafe private void buttonGetDllTypes_Click(object sender, EventArgs e)
{
fileToOpen = "C:\\myFile.ext";
fixed (char* p = fileToOpen)
{
OpenFile(p);
}
}
=============================================

But it doesn't work. I don't know if this function is deprecated or
there is a problem in the calling him. When I build or run my project
there is not any error.
I want to know the list of functions in the dll. Can I retrieve these
from the dll?

Can someone Help me. Thanks
 
M

Morten Wennevik

Hi Sheikko,

A C/C++ char is the equivalent of a byte in C#. Try changing your char*
to byte*. To get a byte array out of a string, use Encoding.GetBytes.



Hi, friends. I am new in this group and I have a problem. I am just
started to program in cSharp and I need a help.
I need to import a ddl and to use one of its function. The function, in
C language, require in input a pointer char:

OpenFile(char* filename);

To use this function in cSharp I have writing the following code:
=============================================
[DllImport("My.dll")]
unsafe public static extern int OpenFile(char* filename);
.....
unsafe private void buttonGetDllTypes_Click(object sender, EventArgs e)
{
fileToOpen = "C:\\myFile.ext";
fixed (char* p = fileToOpen)
{
OpenFile(p);
}
}
=============================================

But it doesn't work. I don't know if this function is deprecated or
there is a problem in the calling him. When I build or run my project
there is not any error.
I want to know the list of functions in the dll. Can I retrieve these
from the dll?

Can someone Help me. Thanks
 
S

Sheikko

Thank you very much for the answer.
I have changed the code, but it still not work

fixed (byte* p = fileToOpen)
{
CompeGPSPort_OpenFile(p);
MessageBox.Show("ciao");
}

There is no method Encoding.GetBytes

Can you write me an exemple_ please

Hi Sheikko,

A C/C++ char is the equivalent of a byte in C#. Try changing your char*
to byte*. To get a byte array out of a string, use Encoding.GetBytes.



Hi, friends. I am new in this group and I have a problem. I am just
started to program in cSharp and I need a help.
I need to import a ddl and to use one of its function. The function, in
C language, require in input a pointer char:
OpenFile(char* filename);
To use this function in cSharp I have writing the following code:
=============================================
[DllImport("My.dll")]
unsafe public static extern int OpenFile(char* filename);
.....
unsafe private void buttonGetDllTypes_Click(object sender, EventArgs e)
{
fileToOpen = "C:\\myFile.ext";
fixed (char* p = fileToOpen)
{
OpenFile(p);
}
}
=============================================
But it doesn't work. I don't know if this function is deprecated or
there is a problem in the calling him. When I build or run my project
there is not any error.
I want to know the list of functions in the dll. Can I retrieve these
from the dll?
Can someone Help me. Thanks--
Happy Coding!
Morten Wennevik [C# MVP]
 
M

Morten Wennevik

byte[] bytes = System.Text.Encoding.Default.GetBytes(fileToOpen);

byte* p = bytes;

You may also want to try a pointer to the string using the 'fixed'
keyword. The article below describes some advanced pinvoking using the
compact framework, but the principles are the same for the full framework.

http://msdn.microsoft.com/library/default.asp?url=/library/en-us/dnnetcomp/html/netcfadvinterop.asp


Thank you very much for the answer.
I have changed the code, but it still not work

fixed (byte* p = fileToOpen)
{
CompeGPSPort_OpenFile(p);
MessageBox.Show("ciao");
}

There is no method Encoding.GetBytes

Can you write me an exemple_ please

Hi Sheikko,

A C/C++ char is the equivalent of a byte in C#. Try changing your char*
to byte*. To get a byte array out of a string, use Encoding.GetBytes..



Hi, friends. I am new in this group and I have a problem. I am just
started to program in cSharp and I need a help.
I need to import a ddl and to use one of its function. The function, in
C language, require in input a pointer char:
OpenFile(char* filename);
To use this function in cSharp I have writing the following code:
=============================================
[DllImport("My.dll")]
unsafe public static extern int OpenFile(char* filename);
.....
unsafe private void buttonGetDllTypes_Click(object sender, EventArgs e)
{
fileToOpen = "C:\\myFile.ext";
fixed (char* p = fileToOpen)
{
OpenFile(p);
}
}
=============================================
But it doesn't work. I don't know if this function is deprecated or
there is a problem in the calling him. When I build or run my project
there is not any error.
I want to know the list of functions in the dll. Can I retrieve these
from the dll?
Can someone Help me. Thanks--
Happy Coding!
Morten Wennevik [C# MVP]
 
W

Willy Denoyette [MVP]

Sheikko said:
Hi, friends. I am new in this group and I have a problem. I am just
started to program in cSharp and I need a help.
I need to import a ddl and to use one of its function. The function, in
C language, require in input a pointer char:

OpenFile(char* filename);

To use this function in cSharp I have writing the following code:
=============================================
[DllImport("My.dll")]
unsafe public static extern int OpenFile(char* filename);
.....
unsafe private void buttonGetDllTypes_Click(object sender, EventArgs e)
{
fileToOpen = "C:\\myFile.ext";
fixed (char* p = fileToOpen)
{
OpenFile(p);
}
}
=============================================

But it doesn't work. I don't know if this function is deprecated or
there is a problem in the calling him. When I build or run my project
there is not any error.
I want to know the list of functions in the dll. Can I retrieve these
from the dll?

Can someone Help me. Thanks


Well, you are new to CSharp and you start treating C# as if it was C, you will miss your
start because C# isn't the same as C.
First , you should stay away from unsafe constructs whenever possible. Second, you should
stay away from interop features like PInvoke, at least when you start learning the language
and (more importantly) the framework.
To achieve the first goal, remove the unsafe from signature (DllImport) and change the
argument as follows:
public static extern int OpenFile(string filename);

and, change your code into:
fileToOpen = "C:\\myFile.ext";
OpenFile(fileToOpen);

this leaves you with one common issue, that is - what is a char* in C -.
What is it pointing to exactly, is it pointing to a "Unicode character" array or is it
pointing to a "Single byte character" array or is it pointing to something else?
You should know that a 'char' in C# is Unicode encoded, that is' it's a 'wide' character,
and a string in .NET is an array of char's. This means that somehow you need to indicate to
the PInvoke layer what the native code char* looks like, if you don't give an hint, PInvoke
considers char* a pointer to a null terminated "single byte character" array. Indicating
what the destination points to, can be done by using the MarshalAs attribute. For instance
if the native code expects a pointer to a "Wide character" array, you have to apply the
following attribute to the argument, like :

public static extern int OpenFile([MarshalAs(UnmanagedType.LPWStr)] string filename);
if it's pointing to a single byte character array, you can change the signature into this:
public static extern int OpenFile([MarshalAs(UnmanagedType.LPStr)] string filename);

The second goal can be achieved by using the framework classes instead of calling into
unmanaged code, in the above case, it's just a matter of using the FileStream classes in
order to access files on disk.

Please consult the docs for details on other possible marshaling types and consult the docs
whenever you dive into interop or whatever. Don't start coding in C# like you would in C,
read the docs, leverage the framework classes first, learn the C# language and forget about
C (coding styles) and it's libraries.

Another remark, you declared the OpenFile to return an int
1) are you sure it returns an int?
2)why don't you use the return value in your code?
If you don't have access to the documentation of the library functions you are calling, you
will have to guess both the arguments and return types, IMO in this case you shouldn't call
into the library at all.

And last but not least, please be more explicit when posting questions like this, post the
error message(s), stack traces etc....
"But it doesn't work. " isn't of any help

Willy.
 
S

Sheikko

I have solved The problem. THank you.



Hi, friends. I am new in this group and I have a problem. I am just
started to program in cSharp and I need a help.
I need to import a ddl and to use one of its function. The function, in
C language, require in input a pointer char:
OpenFile(char* filename);
To use this function in cSharp I have writing the following code:
=============================================
[DllImport("My.dll")]
unsafe public static extern int OpenFile(char* filename);
.....
unsafe private void buttonGetDllTypes_Click(object sender, EventArgs e)
{
fileToOpen = "C:\\myFile.ext";
fixed (char* p = fileToOpen)
{
OpenFile(p);
}
}
=============================================
But it doesn't work. I don't know if this function is deprecated or
there is a problem in the calling him. When I build or run my project
there is not any error.
I want to know the list of functions in the dll. Can I retrieve these
from the dll?
Can someone Help me. ThanksWell, you are new to CSharp and you start treating C# as if it was C, you will miss your
start because C# isn't the same as C.
First , you should stay away from unsafe constructs whenever possible. Second, you should
stay away from interop features like PInvoke, at least when you start learning the language
and (more importantly) the framework.
To achieve the first goal, remove the unsafe from signature (DllImport) and change the
argument as follows:
public static extern int OpenFile(string filename);

and, change your code into:
fileToOpen = "C:\\myFile.ext";
OpenFile(fileToOpen);

this leaves you with one common issue, that is - what is a char* in C -.
What is it pointing to exactly, is it pointing to a "Unicode character" array or is it
pointing to a "Single byte character" array or is it pointing to something else?
You should know that a 'char' in C# is Unicode encoded, that is' it's a 'wide' character,
and a string in .NET is an array of char's. This means that somehow you need to indicate to
the PInvoke layer what the native code char* looks like, if you don't give an hint, PInvoke
considers char* a pointer to a null terminated "single byte character" array. Indicating
what the destination points to, can be done by using the MarshalAs attribute. For instance
if the native code expects a pointer to a "Wide character" array, you have to apply the
following attribute to the argument, like :

public static extern int OpenFile([MarshalAs(UnmanagedType.LPWStr)] string filename);
if it's pointing to a single byte character array, you can change the signature into this:
public static extern int OpenFile([MarshalAs(UnmanagedType.LPStr)] string filename);

The second goal can be achieved by using the framework classes instead of calling into
unmanaged code, in the above case, it's just a matter of using the FileStream classes in
order to access files on disk.

Please consult the docs for details on other possible marshaling types and consult the docs
whenever you dive into interop or whatever. Don't start coding in C# like you would in C,
read the docs, leverage the framework classes first, learn the C# language and forget about
C (coding styles) and it's libraries.

Another remark, you declared the OpenFile to return an int
1) are you sure it returns an int?
2)why don't you use the return value in your code?
If you don't have access to the documentation of the library functions you are calling, you
will have to guess both the arguments and return types, IMO in this case you shouldn't call
into the library at all.

And last but not least, please be more explicit when posting questions like this, post the
error message(s), stack traces etc....
"But it doesn't work. " isn't of any help

Willy.
 

Ask a Question

Want to reply to this thread or ask your own question?

You'll need to choose a username for the site, which only take a couple of moments. After that, you can post your question and our members will help you out.

Ask a Question

Top