Bonjour, je sais que ce problème a pu être traité de nombreuses fois mais les réponses apportées sur différents forums ne me conviennent pas.

Je vous explique : l'idée était de créer une petite application en C# permettant de gérer une caméra de surveillance. Pour cela, j'ai besoin de me logger à elle.
Ainsi, j'ai importé des méthodes de la dll dhnetsdk.dll.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
using System.Runtime.InteropServices;
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
static public int lLogin;
 
public delegate void fDisConnect(int lLoginID, IntPtr pchDVRIP, int nDVRPort, uint dwUser);
public delegate void fHaveReConnect(int lLoginID, IntPtr pchDVRIP, int nDVRPort, uint dwUser);
 
[DllImport("dhnetsdk.dll", CallingConvention = CallingConvention.Cdecl)]
public static extern int CLIENT_Login(string pchDVRIP, ushort wDVRPort, string pchUserName, string pchPassword, NET_DEVICEINFO lpDeviceInfo, IntPtr error);
 
[DllImport("dhnetsdk.dll", CallingConvention = CallingConvention.Cdecl)]
//[return: MarshalAs(UnmanagedType.I1)]
public static extern bool CLIENT_Init(fDisConnect cbDisConnect, uint dwUser);
 
 
[StructLayout(LayoutKind.Sequential)] //Je ne sais pas vraiment à quoi sert le sequential :? ?
public class NET_DEVICEINFO
{
    [MarshalAs(UnmanagedType.ByValArray, SizeConst = 48)]
    public byte[] sSerialNumber;
    public byte byAlarmInPortNum;
    public byte byAlarmOutPortNum;
    public byte byDiskNum;
    public byte byDVRType;
    public byte byChanNum;
        }
 
 
fDisConnect fDisConnecthandler = fDisConnectMethod;
fHaveReConnect fHaveReConnecthandler = fHaveReConnectMethod;
NET_DEVICEINFO deviceinfo = new NET_DEVICEINFO();
IntPtr iRet = new IntPtr(0);
CLIENT_Init(fDisConnectMethod, 0); //A cette ligne je reçois l'erreur :
//PInvokeStackImbalance a été détecté
//Message: Un appel à la fonction PInvoke 'WindowsFormsApplication1!WindowsFormsApplication1.Form1::CLIENT_Init' a déséquilibré la pile. Cela peut se produire, car la signature PInvoke
//managée ne correspond pas à la signature cible non managée. Vérifiez que la convention d'appel et les paramètres de la signature PInvoke correspondent à la signature non managée cible.
 
lLogin = CLIENT_Login("256.256.256.256", 00000, "name", "pwd", deviceinfo, iRet);
if (lLogin > 0)
{
//Blabla
}
else
Console.WriteLine("Login device failed");
Selon les différents forums que j'ai pu parcourir, il est dit qu'il y a un problème entre les ints et les longs (dans ces lignes de code, les longs on été changé en ints) l'erreur reste la même.
Il est également conseillé de "marshalé" (histoire de booléans codés en 4 bytes contre certains en 1 bytes), j'ai donc ajouté la ligne :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
[return: MarshalAs(UnmanagedType.I1)]
devant chaque méthode renvoyant un bool. Sans succès.
De même j'ai essayé :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
[return: MarshalAs(UnmanagedType.Bool)]
qui devrait être plus adéquat mais ce n'était pas mieux.

Pouvez-vous m'aider ? Je suis débutant en la matière, j'espère ne pas avoir fait trop de fautes.


Cordialement, MiniSofty