OVH Cloud OVH Cloud

DllImport

2 réponses
Avatar
B#..
Bonjours a tous,

Je dois implémenter une dll externe pour gérer un periphérique.
L'ouverture du port sur lequel il est connecté se fait par une procédure qui
réclame un pointeur de type char* pointant sur le nom du port ( "COM1:" ...)
et d'un long donnant la vitesse de transmission (9600...).
J'ai déclaré le proc. comme suit :

[DllImport ("xxx.dll")]
unsafe static extern long InitCommunication (char* pt, long bd)

.Ma proc déclare un tableau de char et son pointeur dans un espace "unsafe":
...
unsafe
{
long bd = 9600;
char[] port = new char[] {'C','O','M','1',':'}
fixed (char* Ptr = port)
{
InitCommunication(Ptr,Bd);
}
}
....

L'execution de ce code provoque une erreur "Attempted to read or write
protected memory" dont je n'arrive pas à me débarasser...
Si quelqu'un a déjà résolu un cas similaire, c'est a dire implémenter en C#
une procédure d'une dll écrite en C/C++ demandant un pointeur de char ..

Merci d'avance...

Bruno

2 réponses

Avatar
Sébastien FERRAND
Bonjour B#..,

je pense que ca marchera mieux comme cela :

[DllImport ("xxx.dll")]
static extern long InitCommunication (string pt, int bd)

- ton char* est en réalité un char[], ce qui est l'équivalent d'une string.
- le long du non managé est sur 32bits, comme le int de C#.

Séb


---
Sébastien FERRAND [MVP C#]
http://blogs.developpeur.org/sebmafate
msnim:

Bonjours a tous,

Je dois implémenter une dll externe pour gérer un periphérique.
L'ouverture du port sur lequel il est connecté se fait par une
procédure qui
réclame un pointeur de type char* pointant sur le nom du port (
"COM1:" ...)
et d'un long donnant la vitesse de transmission (9600...).
J'ai déclaré le proc. comme suit :
[DllImport ("xxx.dll")]
unsafe static extern long InitCommunication (char* pt, long bd)
.Ma proc déclare un tableau de char et son pointeur dans un espace
"unsafe":
...
unsafe
{
long bd = 9600;
char[] port = new char[] {'C','O','M','1',':'}
fixed (char* Ptr = port)
{
InitCommunication(Ptr,Bd);
}
}
....
L'execution de ce code provoque une erreur "Attempted to read or write
protected memory" dont je n'arrive pas à me débarasser...
Si quelqu'un a déjà résolu un cas similaire, c'est a dire implémenter
en C#
une procédure d'une dll écrite en C/C++ demandant un pointeur de char
..
Merci d'avance...

Bruno



Avatar
B#..
Sebastien : UN GRAND MERCI...!!

"Sébastien FERRAND <listes_seb[a]vbmaf.net>"
<=?iso-8859-1?Q?Sébastien FERRAND <listes_seb[a]vbmaf.net>?=> a
écrit dans le message de news:

Bonjour B#..,

je pense que ca marchera mieux comme cela :
[DllImport ("xxx.dll")]
static extern long InitCommunication (string pt, int bd)

- ton char* est en réalité un char[], ce qui est l'équivalent d'une
string.
- le long du non managé est sur 32bits, comme le int de C#.

Séb


---
Sébastien FERRAND [MVP C#]
http://blogs.developpeur.org/sebmafate
msnim:

Bonjours a tous,

Je dois implémenter une dll externe pour gérer un periphérique.
L'ouverture du port sur lequel il est connecté se fait par une
procédure qui
réclame un pointeur de type char* pointant sur le nom du port (
"COM1:" ...)
et d'un long donnant la vitesse de transmission (9600...).
J'ai déclaré le proc. comme suit :
[DllImport ("xxx.dll")]
unsafe static extern long InitCommunication (char* pt, long bd)
.Ma proc déclare un tableau de char et son pointeur dans un espace
"unsafe":
...
unsafe
{
long bd = 9600;
char[] port = new char[] {'C','O','M','1',':'}
fixed (char* Ptr = port)
{
InitCommunication(Ptr,Bd);
}
}
....
L'execution de ce code provoque une erreur "Attempted to read or write
protected memory" dont je n'arrive pas à me débarasser...
Si quelqu'un a déjà résolu un cas similaire, c'est a dire implémenter
en C#
une procédure d'une dll écrite en C/C++ demandant un pointeur de char
..
Merci d'avance...

Bruno