Bonjour,
Dans le cadre de la migration d'une appli VB6 en VB.NET, je me retrouve confronté au problème d'appeler du code non-managé (de winspool.drv) depuis mon code VB.NET. Je précise que je maîtrise plutôt bien C++, mais que je suis une bille en VB, avec ou sans .NET.
J'ai donc déclaré la méthode en question :
Private Declare Function EnumMonitors Lib "winspool.drv" Alias "EnumMonitorsA" (ByVal pName As String, ByVal Level As System.UInt32, ByRef pMonitors As MONITOR_INFO_1(), ByVal cdBuf As System.UInt32, ByRef pcbNeeded As System.UInt32, ByRef pcReturned As System.UInt32) As System.Int32
J'ai bien évidemment défini la structure MONITOR_INFO_1 pour correspondre à ce qu'attent la fonction EnumMonitorsA.
1 2 3
| Private Structure MONITOR_INFO_1
Dim pName As String
End Structure |
Et, lors de l'appel, mon premier appel à EnumMonitors, avec Nothing sur le troisième paramètre, se passe bien. Le deuxième, avec une array de MONITOR_INFO_1 (de la bonne taille), se passe très mal en revanche, puisqu'il fait planter le CLR.
1 2 3 4 5
|
Dim tmp As MONITOR_INFO_1 = New MONITOR_INFO_1
Dim size As Integer = System.Runtime.InteropServices.Marshal.SizeOf(tmp.GetType())
Dim mi1(sizeNeeded / size) As MONITOR_INFO_1 'sizeNeeded a été renvoyé par le premier appel à EnumMonitorsA
If EnumMonitors(vbNullString, 1, mi1, pcbNeeded, pcbNeeded, pcReturned) Then 'ici ça plante avec un System.ExecutionEngineException |
Je passe mes paramètres correctement si j'en crois MSDN, et ma structure a la bonne taille (4).
Donc, qu'est-ce que j'ai fait de mal ?
Partager