Appel de dll

Signaler
Messages postés
16
Date d'inscription
mercredi 12 janvier 2005
Statut
Membre
Dernière intervention
1 février 2005
-
Messages postés
16
Date d'inscription
mercredi 12 janvier 2005
Statut
Membre
Dernière intervention
1 février 2005
-
Bonjour,
je cherche à appeler depuis C# une fonction en dll dont la déclaration en C est la suivante:

I2COpen(hWnd, // Application Window Handle
hALInstance, // Application Instance
&i2c) // I2C Link Property Struct

La structure i2c est de la forme:
i2c.comport = 1;
i2c.WmMsgNo = WM_USER;
i2c.pfCBF = NULL; // Application Callback Function Address.
i2c.pcLogFileName = "log.txt";

Je coince un peu au niveau de la déclaration dans C#:
[DllImport("i2c32200.dll")]
private static extern int I2COpen (...

ensuite comment déclarer la structure et finalement appeler la fonction.

Merci.

28 réponses

Messages postés
1522
Date d'inscription
mardi 18 décembre 2001
Statut
Modérateur
Dernière intervention
21 août 2010
5
Regarde la doc de DLLImportAttribute tu aura des lien sur le marshaling de tes données en fonction des type C et autre...



A++

Crazyht
MVP Visual C#.NET

[Admin Codes-Sources]
[Membre Developer-Association]
Messages postés
16
Date d'inscription
mercredi 12 janvier 2005
Statut
Membre
Dernière intervention
1 février 2005

Oui,
j'ai déjà un peu regardé mais c'est plutôt hardu pour moi qui vient de delphi et ne connait rien en C/C++.
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
85
pour la méthode ça devrait donner qqch de ce genre :
[DllImport("i2c32200.dll")]
private static extern int I2COpen(IntPtr hWnd, IntPtr hALInstance, ref I2CStruct i2c);

Mais ce serait mieux de connaitre la déclaration exacte de la méthode avant de faire l'interop.
Et pour la structure c'est même obligatoire de l'avoir.
Tu dois avoir un fichier .h les contenant logiquement.

Cocoricoooooooo !!!!
coq
MVP Visual C#
Messages postés
16
Date d'inscription
mercredi 12 janvier 2005
Statut
Membre
Dernière intervention
1 février 2005

Merci pour le coup de main.
J'ai extrais ce qui me semble intérressant du fichier header car il est plutôt volumineux:

1. DLL Function Return Value

Each DLL function returns a value that can be used to detect if the
operation was accepted or denied. Function return codes are specified
later in this file.

2. Application Window Message

If an Application specifies an Application Window Message Number in
the iPort I2C Link property structure during the I2COpen function call,
iPort events will cause messages to be sent to the Application's Window
Message processing function, with the message WPARAM parameter indicating
the event code as specified later in this file.

3. Callback Functions

If an Application specifies a C Callback Function in the iPort I2C Link
property structure during the I2COpen function call, iPort events will
cause callbacks to the specified function, with the function WPARAM
parameter indicating the event code as specified later in this file.


***************************************************************************/

#define I2C_APIV 2 // DLL API Version Defined in this File.

#ifdef WIN32
#define CALLING_CONVENTION __stdcall
#else
#define CALLING_CONVENTION far pascal
#endif

#pragma pack(1) /* Force byte packing throughout */

#ifdef __cplusplus
extern "C" { /* Assume C declarations for C++ */
#endif /* __cplusplus */

// iPort I2C Link Properties Structure Definition

struct I2C_PROP
{
// PC: Open Parameters (READ/WRITE ACCESS)
unsigned char comport; // PC Comport for Host Adapter
// (0 = ISA Card Port)
// (1..9)
unsigned int isaport; // ISA Card Port Address
// (Reserved for future implementation)
unsigned int isairq; // ISA Card IRQ Number
// (Reserved for future implementation)

// Host Adapter: Open Parameters (READ/WRITE ACCESS)
UINT WmMsgNo; // Application Windows Msg Number
// (0 = No Messages Generated)
// (WM_USER..0x7FFF)
void (far *pfCBF)(WPARAM); // Application CallBack C Function Address
// (NULL = No Callback Generated)
LPSTR pcLogFileName; // I2C Link Log File Path/Filename
// (NULL = No Log File Generated)
unsigned char LogFileLevel; // I2C Link Log File Recording Level
// (0 = No Log File Generated)
// (1 = Log Critical Messages)
// (2 = Log General Messages)
// (3 = Log All Messages)
// (4 = Verbose)
unsigned int LogFileSize; // I2C Link Log File Max. Size (Lines)
// (Minimum Default Size = 20 lines)
unsigned char HostSlaveAddr; // Host Adapter Own I2C Slave Address
// (2..254 Even Numbers)
unsigned int BusTimeOut; // I2C Bus Aquisition/Byte Transfer Timeout (Msec)
// (0 = No Timeout)
unsigned char MasterBitRate; // I2C Master Bit Rate (approximate kHz)
// (1 = 12.5)
// (2 = 100)
unsigned int MasterRxBufSize; // I2C Master Rx Msg Buffer Size
// (Minimum Default Size = 512 bytes)
unsigned int MasterTxBufSize; // I2C Master Tx Msg Buffer Size
// (Minimum Default Size = 512 bytes)
unsigned char MasterArbRetry; // I2C Master Arbitration Loss Retry Count.
// (Reserved for future implementation)
// (0 = No Retries)
unsigned char SlaveRxGCEnable; // I2C Slave Rx General Call Enable
// (0 = Disabled)
unsigned int SlaveRxBufSize; // I2C Slave Rx Msg Buffer Size
// (Minimum Default Size = 1 byte)
unsigned int SlaveTxBufSize; // I2C Slave Tx Msg Buffer Size
// (Minimum Default Size = 512 bytes)


// Status Codes (READ ONLY ACCESS)
unsigned int MasterStatus; // Master Status (See Below)
unsigned int SlaveStatus; // Slave Status (See Below)
unsigned int LinkStatus; // Link Status
// (0 = iPort Link Not Open)

// I2C Master Operating Parameters (READ ONLY ACCESS)
unsigned int MasterTxByteCount; // Master Tx Bytes Acknowledged
unsigned int MasterRxMsgPresent;// Master Rx Msg Present
// (0 = No Master Rx Msg Present)
unsigned int MasterRxMsgSize; // Master Rx Size of Msg (Bytes)
// (Used to help App Allocate Memory)

// I2C Slave Operating Parameters (READ ONLY ACCESS)
unsigned char SlaveTxMsgReq; // Slave Tx Msg Request Flag
// (0 = No Slave Tx Msg Request)
unsigned int SlaveRxMsgPresent;// Slave Rx Msg Present
// (0 = No Slave Rx Msg Present)
unsigned int SlaveRxMsgSize; // Slave Rx Size of Msg (Bytes)
// (Used to help App Allocate Memory)
unsigned int SlaveRxGCDetect; // Slave Rx General Call Detected
// (0 = I2C General Call NOT Detected)

// I2C Host Adapter Version Information (READ ONLY ACCESS)
unsigned int DllVer; // DLL Version (MAJOR XX.XXD MINOR).
unsigned int ApiVer; // API Version.
unsigned int FwVer; // iPort Firmware Ver (MAJOR XX.XXD MINOR).
};


/***************************************************************************
Function: I2COpen()

Purpose: 1) Submit a request to open I2C Link communications.

Usage: Called by an application to enable I2C communication.

Arguments See Below.

Return: 0 if operation accepted, else

DLL Function Return Error Codes:

I2C_ALREADY_OPEN I2C Link is Already Open.
I2C_OPER_IN_PROGRESS I2C Link Operation in Progress.
I2C_LOG_OPEN_ERR Log File Open Error.
I2C_INVALID_PORT_NO Invalid Communications Port Number.
I2C_OPEN_FAILED Invalid Open Parameter.
I2C_BAD_MSG_NO Invalid Windows Msg Number.
I2C_BAD_SLV_ADDR Invalid I2C Slave Address Assignment.
I2C_BAD_BIT_RATE Invalid I2C Bit Rate Assignment.
I2C_MEM_ALLOC_ERR Unable to Allocate Memory Buffer.

Exceptions
None

Example:

#include <windows.h>
#include

#define I2C_MSG WM_USER // I2C Application Windows Msg Number

static struct I2C_PROP i2c; // I2C Property Structure

appOpen()
{
int result;

i2c.comport = 1; // PC Comport for Host Adapter
i2c.WmMsgNo = I2C_MSG; // Application Windows Msg Number
i2c.pfCBF = NULL; // Application Callback Function Address.
i2c.pcLogFileName = "log.txt"; // Log File Path/Filename
i2c.LogFileLevel = 3; // Log File Recording Level
i2c.LogFileSize = 1000; // Log File Max. Size (Lines)
i2c.HostSlaveAddr = 0x6E; // iPort I2C Slave Address
i2c.BusTimeOut = 1000; // I2C Bus Aquisition/Byte Transfer Timeout (Msec)
i2c.MasterBitRate = 2; // I2C Master Bit Rate
i2c.MasterRxBufSize = 512; // I2C Master Rx Msg Buffer Size
i2c.MasterTxBufSize = 512; // I2C Master Tx Msg Buffer Size
i2c.MasterTxArbRetry = 0; // I2C Master Tx Arbitration Loss Retry Count.
i2c.SlaveRxGCEnable = 1; // I2C Slave Rx General Call Enable
i2c.SlaveRxBufSize = 512; // I2C Slave Rx Msg Buffer Size
i2c.SlaveTxBufSize = 512; // I2C Slave Tx Msg Buffer Size

if ((result = I2COpen( // Open I2C Link
hWnd, // Application Window Handle
hALInstance, // Application Instance
&i2c // I2C Link Property Struct
)) != 0) // if failed
{
// Link Open Denied

}

return(result);
}

***************************************************************************/

int
CALLING_CONVENTION
I2COpen(
HWND hndl, // Application Window Handle
HINSTANCE hInstance, // Application Instance
struct I2C_PROP far *ps // I2C Link Property Struct Pointer
);

/***************************************************************************
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
85
euh
tu peux me le refaire avec les sauts de ligne stp parce que là c'est plutôt illisible lol

Cocoricoooooooo !!!!
coq
MVP Visual C#
Messages postés
16
Date d'inscription
mercredi 12 janvier 2005
Statut
Membre
Dernière intervention
1 février 2005

J'espére que cela fonctionne cette fois.
Par précaution vous pouvez le trouver sur mon espace perso:
http://pascal.bonino.free.fr/i2c200.h


1. DLL Function Return Value

Each DLL function returns a value that can be used to detect if the
operation was accepted or denied. Function return codes are specified
later in this file.

2. Application Window Message

If an Application specifies an Application Window Message Number in
the iPort I2C Link property structure during the I2COpen function call,
iPort events will cause messages to be sent to the Application's Window
Message processing function, with the message WPARAM parameter indicating
the event code as specified later in this file.

3. Callback Functions

If an Application specifies a C Callback Function in the iPort I2C Link
property structure during the I2COpen function call, iPort events will
cause callbacks to the specified function, with the function WPARAM
parameter indicating the event code as specified later in this file.

#ifdef WIN32
#define CALLING_CONVENTION __stdcall
#else
#define CALLING_CONVENTION far pascal
#endif

#pragma pack(1) /* Force byte packing throughout */

#ifdef __cplusplus
extern "C" { /* Assume C declarations for C++ */
#endif /* __cplusplus */

// iPort I2C Link Properties Structure Definition
struct I2C_PROP
{
// PC: Open Parameters (READ/WRITE ACCESS)
unsigned char comport; // PC Comport for Host Adapter
unsigned int isaport; // ISA Card Port Address
unsigned int isairq; // ISA Card IRQ Number
// Host Adapter: Open Parameters (READ/WRITE ACCESS)
UINT WmMsgNo; // Application Windows Msg Number
void (far *pfCBF)(WPARAM); // Application CallBack C Function Address
LPSTR pcLogFileName; // I2C Link Log File Path/Filename
unsigned char LogFileLevel; // I2C Link Log File Recording Level
unsigned int LogFileSize; // I2C Link Log File Max. Size (Lines)
unsigned char HostSlaveAddr; // Host Adapter Own I2C Slave Address
unsigned int BusTimeOut; // I2C Bus Aquisition/Byte Transfer Timeout (Msec)
unsigned char MasterBitRate; // I2C Master Bit Rate (approximate kHz)
unsigned int MasterRxBufSize; // I2C Master Rx Msg Buffer Size
unsigned int MasterTxBufSize; // I2C Master Tx Msg Buffer Size
unsigned char MasterArbRetry; // I2C Master Arbitration Loss Retry Count.
unsigned char SlaveRxGCEnable; // I2C Slave Rx General Call Enable
unsigned int SlaveRxBufSize; // I2C Slave Rx Msg Buffer Size
unsigned int SlaveTxBufSize; // I2C Slave Tx Msg Buffer Size

// Status Codes (READ ONLY ACCESS)
unsigned int MasterStatus; // Master Status (See Below)
unsigned int SlaveStatus; // Slave Status (See Below)
unsigned int LinkStatus; // Link Status

// I2C Master Operating Parameters (READ ONLY ACCESS)
unsigned int MasterTxByteCount; // Master Tx Bytes Acknowledged
unsigned int MasterRxMsgPresent;// Master Rx Msg Present
unsigned int MasterRxMsgSize; // Master Rx Size of Msg (Bytes)

// I2C Slave Operating Parameters (READ ONLY ACCESS)
unsigned char SlaveTxMsgReq; // Slave Tx Msg Request Flag
unsigned int SlaveRxMsgPresent;// Slave Rx Msg Present
unsigned int SlaveRxMsgSize; // Slave Rx Size of Msg (Bytes)
unsigned int SlaveRxGCDetect; // Slave Rx General Call Detected

// I2C Host Adapter Version Information (READ ONLY ACCESS)
unsigned int DllVer; // DLL Version (MAJOR XX.XXD MINOR).
unsigned int ApiVer; // API Version.
unsigned int FwVer; // iPort Firmware Ver (MAJOR XX.XXD MINOR).
};


/***************************************************************************
Function: I2COpen()
Return: 0 if operation accepted, else
DLL Function Return Error Codes:
I2C_ALREADY_OPEN I2C Link is Already Open.
I2C_OPER_IN_PROGRESS I2C Link Operation in Progress.
I2C_LOG_OPEN_ERR Log File Open Error.

Example:
#include <windows.h>
#include

#define I2C_MSG WM_USER // I2C Application Windows Msg Number
static struct I2C_PROP i2c; // I2C Property Structure

appOpen()
{
int result;

i2c.comport = 1; // PC Comport for Host Adapter
i2c.WmMsgNo = I2C_MSG; // Application Windows Msg Number
i2c.pfCBF = NULL; // Application Callback Function Address.
i2c.pcLogFileName = "log.txt"; // Log File Path/Filename
i2c.LogFileLevel = 3; // Log File Recording Level
i2c.LogFileSize = 1000; // Log File Max. Size (Lines)
i2c.HostSlaveAddr = 0x6E; // iPort I2C Slave Address
i2c.BusTimeOut = 1000; // I2C Bus Aquisition/Byte Transfer Timeout (Msec)
i2c.MasterBitRate = 2; // I2C Master Bit Rate
i2c.MasterRxBufSize = 512; // I2C Master Rx Msg Buffer Size
i2c.MasterTxBufSize = 512; // I2C Master Tx Msg Buffer Size
i2c.MasterTxArbRetry = 0; // I2C Master Tx Arbitration Loss Retry Count
i2c.SlaveRxGCEnable = 1; // I2C Slave Rx General Call Enable
i2c.SlaveRxBufSize = 512; // I2C Slave Rx Msg Buffer Size
i2c.SlaveTxBufSize = 512; // I2C Slave Tx Msg Buffer Size

if ((result = I2COpen( // Open I2C Link
hWnd, // Application Window Handle
hALInstance, // Application Instance
&i2c // I2C Link Property Struct
)) != 0) // if failed
{
// Link Open Denied
}
return(result);
}

***************************************************************************/
int
CALLING_CONVENTION
I2COpen(
HWND hndl, // Application Window Handle
HINSTANCE hInstance, // Application Instance
struct I2C_PROP far *ps // I2C Link Property Struct Pointer
);
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
85
C++ => C#
------------
unsigned char => byte
unsigned int => uint
LPSTR => [MarshalAs(UnmanagedType.LPStr)] string (ou [MarshalAs(UnmanagedType.LPStr)] StringBuilder si le code non managé doit ecrire des infos dans cet élément là)

Par contre pour le fameux "void (far *pfCBF)(WPARAM);" je ne suis pas trop sur
Tu devras lui passer un delegate je pense. La methode associée ne retournera pas de valeur (void) et recevra en parametre un uint ou UInt64 (WPARAM)

Cocoricoooooooo !!!!
coq
MVP Visual C#
Messages postés
16
Date d'inscription
mercredi 12 janvier 2005
Statut
Membre
Dernière intervention
1 février 2005

Bien,
j'ai rentré la déclaration et la structure.

Maintenant il me faut renseigner les paramètres de la structure et appeler la fonction.
Peux-tu m'expliquer tout ça ?

Désolé, ça fait vraiment ras des pâquerettes mais en delphi tout est tellement simple.
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
85
En prenant monI2CProp comme nom de ton instance de la struct ça devrait donner qqch de ce genre :

IntPtr hInst = Marshal.GetHINSTANCE(this.GetType().Module); // je pense qu'il s'agit de ça, mais ne connaissant pas ce que tu utilises je ne suis pas du tout sûr.
int result = I2COpen(this.Handle, hInst, ref monI2CProp);

Cocoricoooooooo !!!!
coq
MVP Visual C#
Messages postés
16
Date d'inscription
mercredi 12 janvier 2005
Statut
Membre
Dernière intervention
1 février 2005

Ok, voici ma feuille que me reste t'il à faire pour que la fonction OuvreI2C puisse appeler I2COpen ?

using System;
using System.Runtime.InteropServices;
using System.Data;


namespace PilotageDAQ
{
/// <summary>
/// Description résumée de I2C.
/// </summary>
public class I2C
{
[DllImport("i2c32200.dll")]
private static extern int I2COpen (IntPtr hWnd, IntPtr hALInstance, ref I2CStruct i2c);
[DllImport("i2c32200.dll")]
private static extern int I2Close ();
[DllImport("i2c32200.dll")]
private static extern int I2CGetStatus ();
[DllImport("i2c32200.dll")]
private static extern int I2CMasterTx ();
[DllImport("i2c32200.dll")]
private static extern int I2CMasterRx ();



// Master Status Codes
private const int I2C_MSDONE= 0x101; // Operation Complete
private const int I2C_MSBUSY= 0x102; // Operation in Progress
// Master Status and Event Codes
private const int I2C_OPEN_SUCCESSFUL= 0x111; // I2C Link Open Successful
private const int I2C_NO_RESPONSE= 0x112; // Host Adapter Not Responding
private const int I2C_HOST_ADAPTER_BUSY= 0x113; // Host Adapter Busy, Msg Not Accepted
private const int I2C_BUS_ERROR= 0x114; // I2C Bus Error Detected
private const int I2C_NO_SLAVE_ACK= 0x115; // I2C Master Tx, Addressed Slave Not Aknowledging
private const int I2C_ARBITRATION_LOSS= 0x116; // I2C Master Bus Abritration Loss Detected
private const int I2C_TX_TIMEOUT= 0x117; // I2C Bus Timeout Detected.
private const int I2C_MTX_COMPLETE= 0x118; // I2C Master Tx Transfer Complete.
private const int I2C_MRX_COMPLETE= 0x119; // I2C Master Rx Transfer Complete
// Function Return Error Codes
private const int I2C_ALREADY_OPEN= 0x301; // I2C Link is Already Open
private const int I2C_OPER_IN_PROGRESS= 0x302; // I2C Link Operation in Progress
private const int I2C_LOG_OPEN_ERR= 0x303; // Log File Open Error
private const int I2C_OPEN_FAILED= 0x305; // Invalid Open Parameter.
private const int I2C_NULL_PTR_ARG= 0x331; // Null Pointer Argument Detected.
private const int I2C_NOT_IMPLEMENTED= 0x999; // Function Not Implemented.
// I2C doNack Parameter Definitions
private const int I2C_NONACK= 0; // Ack Last Master Received Byte.
private const int I2C_NACK= 1; // Nack Last Master Received Byte.
// I2C doStop Parameter Definitions
private const int I2C_NOSTOP= 0; // No Stop After Last Byte, for Repeated Start.
private const int I2C_STOP= 1; // Stop After Last Byte



[StructLayout(LayoutKind.Sequential)] // iPort Property Structure
public struct I2CStruct
{// iPort Link Open Command Processing
// PC: Open Parameters (READ/WRITE ACCESS)
public byte comport; // PC Comport for Host Adapter
// (1..9)
// Host Adapter: Open Parameters (READ/WRITE ACCESS)
public uint WmMsgNo; // Host Adapter Windows Msg Number
// (0 = No Messages Generated)
// (I2C_MSG = WM_USER..0x7FFF)
public IntPtr pfCBF; // iPort Callback Function Address
// (NULL = No Callback Generated)
// (iPortMsgHandler = Use Callback)
[MarshalAs(UnmanagedType.LPWStr)] public string pcLogFileName; // Host Adapter Log File Path/Filename
// (NULL = No Log File Generated)
public byte LogFileLevel; // Host Adapter Log File Recording Level
// (0 = No Log File Generated)
// (1 = Log Critical Messages)
// (2 = Log General Messages)
// (3 = Log All Messages)
// (4 = Verbose)
public uint LogFileSize; // Host Adapter Log File Max. Size (Lines)
// (Minimum Default Size = 20 lines)
public byte HostSlaveAddr; // Host Adapter I2C Slave Address
// (2..254 Even Numbers)
public uint BusTimeOut; // I2C Bus Aquisition/Byte Transfer Timeout (Msec)
// (0 = No Timeout)
public byte MasterBitRate; // I2C Master Bit Rate (approximate kHz)
// (1 = 12.5)
// (2 = 100)
public uint MasterRxBufSize; // I2C Master Rx Msg Buffer Size
// (Minimum Default Size = 512 bytes)
public uint MasterTxBufSize; // I2C Master Tx Msg Buffer Size
// (Minimum Default Size = 512 bytes)
public byte MasterArbRetry; // I2C Master Arbitration Loss Retry Count.
// (0 = No Automatic Retries)
public byte SlaveRxGCEnable; // I2C Slave Rx General Call Enable
// (0 = Disabled)
public uint SlaveRxBufSize; // I2C Slave Rx Msg Buffer Size
// (Minimum Default Size = 1 byte)
public uint SlaveTxBufSize; // I2C Slave Tx Msg Buffer Size
// (Minimum Default Size = 512 bytes)
}






public int OuvreI2C(int PortCom, int SlaveAdresse)
{
IntPtr hInst= Marshal.GetHINSTANCE(this.GetType().Module);






int Retour= I2COpen( // Open Link to iPort. Return on Error or Complete
this.Handle, // App Window Handle
hInst, //AfxGetInstanceHandle(), // App Instance
ref MonI2CStruct); // iPort Property Structure
return Retour;
}
}
}
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
85
ba c'est ce qu'elle fais là

Cocoricoooooooo !!!!
coq
MVP Visual C#
Messages postés
16
Date d'inscription
mercredi 12 janvier 2005
Statut
Membre
Dernière intervention
1 février 2005

Le compilo me donne 2 erreurs:
- 'PilotageDAQ.I2C' ne contient pas de définition pour 'Handle'
- Le nom 'MonI2CStruct' n'existe pas dans la classe ni dans l'espace de noms 'PilotageDAQ.I2C'
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
85
"MonI2CStruct" est juste un nom que j'ai donner comme ça, met celui de ton instance de la structure.
Pour ce qui est du Handle je pensais que tu utilisais ça directement dans le form
si ce n'est pas le cas, ajoute un parametre à ta methode OuvreI2C (par exemple) pour lui passer le Handle du Form

Cocoricoooooooo !!!!
coq
MVP Visual C#
Messages postés
16
Date d'inscription
mercredi 12 janvier 2005
Statut
Membre
Dernière intervention
1 février 2005

C'est bon pour le handle, par contre je ne saisis pas le nom de l'instance de la structure à mettre.
D'ailleurs pour moi actuellement la structure est déclarée, mais pas initialisée. Je pense que les 2 phénomènes se rejoignent, mais comment faire ?
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
85
ba par exemple
I2CStruct i2cProps = new I2CStruct();
i2cProps.comport = 1;
i2c.....

et tu passes une reference à i2cProps à la methode I2COpen

Cocoricoooooooo !!!!
coq
MVP Visual C#
Messages postés
16
Date d'inscription
mercredi 12 janvier 2005
Statut
Membre
Dernière intervention
1 février 2005

On progresse.


Il n'y a plus qu'un truc: le fameux "void(far * pfCBF)(WPARAM)


Dans l'initialisation de la structure, si je lui mets 0, il me dit:
"Impossible de convertir implicitement le type 'int' en 'System.IntPtr'" et si je lui mets null, il répond:
"Impossible de convertir une valeur Null en 'System.IntPtr', car il s'agit d'un type valeur".

Précédemment tu as parlé de delegate, j'ai cherché un peu de ce côté, mais sans succés.
As-tu la solution ?
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
85
Si tu es sur de ne pas avoir besoin de callback laisse le IntPtr et affecte lui "IntPtr.Zero" (ou new IntPtr(0))
Maintenant il faut voir si le code non managé va aimer cette façon de faire.

Cocoricoooooooo !!!!
coq
MVP Visual C#
Messages postés
3466
Date d'inscription
lundi 16 octobre 2000
Statut
Modérateur
Dernière intervention
30 octobre 2008
46
C'est compliqué tout ca

Mx
Messages postés
16
Date d'inscription
mercredi 12 janvier 2005
Statut
Membre
Dernière intervention
1 février 2005

Ca va pas être facile.
Après plusieurs essais en modifiant tout ce que je pouvais, j'obtiens invariablement à l'exécution le message suivant:

Une exception non gérée du type 'System.NullReferenceException' s'est produite dans pilotageDAQ.exe

Informations supplémentaires: La référence d'objet n'est pas définie à une instance d'un objet.

Ca ne me parle pas trop, une idée ?
Messages postés
6351
Date d'inscription
samedi 1 juin 2002
Statut
Modérateur
Dernière intervention
2 août 2014
85
Ben passe en debug et regarde quel objet est null ("valeur non définie") justement

Cocoricoooooooo !!!!
coq
MVP Visual C#