Logo UGIdotNET

Discussione 'Conversioni ....'

# Pubblicato il 13 nov 2003 12.59 - Rispondi
Stefano Mora
Conversioni ....
Ciao a tutti,
vorrei sapere se ha ancora senso passare un instance handle da un'applicazione VB.NET ad una DLL scritta in C (quindi non gestita) che deve creare una finestra con una CreateWindow() usando appunto questo handle.
In VB6 funzionava senza problemi ma ora ricevo un errore di tipo invalid handle.

Ciao e grazie !
# Pubblicato il 13 nov 2003 13.22 - Rispondi
Corrado Cavalli [MVP]
Re: Conversioni ....

Prova a postare un esempio di come passi l'handle alla dll e la
dichiarazione della dll stessa...


--
Corrado Cavalli [Microsoft .NET MVP-MCP]
UGIdotNET - http://www.ugidotnet.org
Weblog: http://www.ugidotnet.org/710.blog


----------------------
Questo messaggio è stato postato da microsoft.public.it.dotnet.vb.
# Pubblicato il 13 nov 2003 15.39 - Rispondi
Stefano Mora
Re: Conversioni ....
Nella DLL ho questa funzione:

int __stdcall InitSmokeMeter (HINSTANCE hInst, char *port, WNDPROC lpWndProc, HWND *hwnd, long *MsgCode)

In VB l'ho dichiarata come:

<DllImport("opaclib.dll")> Public Function InitSmokeMeter(ByVal hInst As IntPtr, ByVal port As String, ByVal lpWndProc As NotifyErrorDelegate, ByRef hwnd As IntPtr, ByRef msgcode As Integer) As TecError
End Function

La richiamo dal VB.NET con:

returnErrorCode = InitSmokeMeter(Runtime.InteropServices.Marshal.GetHINSTANCE(myModule), "COM1", AddressOf NotifyError, hwnd, lWM_OPACLIB)

Entro la IniSmokeMeter() richiamo la CreateWindowsEx come segue:
*hWnd = CreateWindowEx(WS_EX_PALETTEWINDOW, szAppName, szAppName,
WS_CAPTION | WS_POPUP | WS_SYSMENU,
0, 0, 256, 64, NULL, NULL, hInst, NULL);

installando come WndProc la seguente funzione in VB:

Public Function NotifyError(ByVal hw As Integer, ByVal uMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer

e dichiarando:

Public Delegate Function NotifyErrorDelegate(ByVal hw As Integer, ByVal uMsg As Integer, ByVal wParam As Integer, ByVal lParam As Integer) As Integer

Il problema è che la CreateWindowEx esce con un errore, la GetLAstError ritorna il codice ERROR_INVALID_WINDOW_HANDLE. Se vado a vedere che messaggi arrivano all WndProc (che è la funzione NotifyError(..) ) scopro che arriva il msg 129 WM_NCCREATE e il msg 130 WM_NCDESTROY.
Il gestore dei precedenti messaggi è la DefWindowProc(....), quindi il gestore di default dei messaggi.

Il giro è un po' contorto ma purtroppo non posso, almeno per il momento, cambiarlo.

Graize, ciao !
# Pubblicato il 13 nov 2003 18.33 - Rispondi
Stefano Mora
Re: Conversioni .... risolto !
Ho trovato !
Il problema era proprio sulla definizione di DefWindowProc(....) i cui parametri erano tutti ByRef !!

Grazie !

© 2001 User Group Italiano UGIdotNET. Tutti i diritti riservati. Note legali. - Partita IVA 01927050185