Principales respuestas
Registrar DLL

Pregunta
-
Hola a todos mi problema es el siguiente, estoy desarrollando una aplicacion en VB.NET en la cual trabajo con API's de windows(user32.dll). Al probar mi aplicacion en mi dispositivo e invocar a la DLL me arroja el siguiente error "No se puede encontrar el archivo DLL PInvoke user32.DLL"
Imagine que tal vez tendria que grabar la DLL en el dispositivo y luego registrarlo, realice esto copiando el archivo regsvrce.exe del SDK para pocket 2003 y la DLL a la carpeta windows del dispositivo luego ejecute el .exe y registre la DLL(\windows\user32.dll) pero me manda el siguiente error
LoadLibrary("\windows\user32.dll") failed
GetLastError returns c1Mi equipo es un a IPAQ 2400
No se que es lo que estoy haciendo mal o si es posible poder registrar la DLL de otra manera.
Saludos.......
Respuestas
-
A pesar que he recorrido mil foros, la respuesta correcta no está.
LA RESPUESTA ESTA AQUI:
ms-help://MS.SSC.v35/MS.SSC.v35.ES/sscprog/html/f3127502-44d2-4cc8-9189-40900b26e8fe.htm
EN LA SECCION Agregar SQL Server Compact 3.5 al proyecto y Configurar SQL Server Compact para la implementación privada
LUEGO DE ÉSTO TE FUNCIONA TODO A MIL........
- Marcado como respuesta Jose Miguel TorresModerator jueves, 5 de abril de 2012 22:25
Todas las respuestas
-
En mi modesta opinión no creo que sea un problema de registro de DLL's, ya que estamos hablando de librerias básicas del sistema operativo.
Creo que el problema lo puedes tener en la definición del DLLImport. ¿Puedes mostrarnos como la haces?
Otro dato más. ¿Qué SO tienes instalado?
Salud y suerte!
-
Hola,
User32.dll no existe en Windows CE. Tanto ésta como kernel32.dll y gdi32.dll estan en coredll.dll (\Windows\Coredll.dll). Asimismo puede que la declaración P/Invoke cambie si te has basado en la de Win32. SI quieres salir de duda, como indica TOni, muestranos la declaración,
un saludo
-
Hola piedra:
Escribo porque ese problema también lo tuve yo pero en otro escenario. Resulta que el Visual Studio cuando va a desplegar la aplicación y si por ejemplo tu dispositivo no tiene el compact framework, el te lo instala en el dispositivo, así también si haces uso del sql server ce; pues bueno, debe de haber un problema al desplegar el sql server ce en la versión windows mobile 5.0, pues no lo instala bien, y cuando hacía por ejemploCode Snippet
public DataBase()
{
objCon = new SqlCeConnection(dataSource);
objCon.Open();
objCom = new SqlCeCommand();
objCom.Connection = objCon;
objDatAdap = new SqlCeDataAdapter();
objDatAdap.SelectCommand = objCom;
}
me saltaba el mismo error sobre el "No se puede encontrar el archivo DLL PInvoke...", así que tuve que instalar el sql server ce a mano. Después trabajando con otros dispositivos que tenian el windows mobile 4.0, no hay ningún problema al desplegar aplicaciones, el VS instala todo lo necesario.
¿Quizás estes utilizando conexión a base de datos o comandos de creación de base de datos y te salta ese error?
Un saludo.
pd: en debug, a mi me salta ese error en la primera línea del código que he puesto más arriba. -
Que tal, esta es la forma en que hago la declaracion de las funciones:
Private Const WM_SYSCOMMAND As Integer = &H112
Private Const SC_CLOSE As Integer = &HF060
'Declaracion de las funciones
<System.Runtime.InteropServices.DllImport("user32.dll")> _
Private
Shared Function FindWindow( _ ByVal lpClassName As String, _ ByVal lpWindowName As String) As System.IntPtr End Function<System.Runtime.InteropServices.DllImport(
"user32.DLL")> _ Private Shared Function SendMessage( _ ByVal hWnd As System.IntPtr, ByVal wMsg As Integer, _ ByVal wParam As Integer, ByVal lParam As Integer _)
As Integer End Function'Y esta es es la manera en que las mando llamar
Dim ptr As IntPtr = FindWindow(Nothing, "Mensaje") If ptr.Equals(IntPtr.Zero) Then Else Call SendMessage(ptr, WM_SYSCOMMAND, SC_CLOSE, 0)EL SO de mi equipo es Windows CE 5.0 y como podemos ver no uso coneccion alguna a BD.
-
Tal y como te apuntaba José Miguel no estás indicando a la dll correcta. Prueba con:
Code Snippet<System.Runtime.InteropServices.DllImport("coredll.dll", EntryPoint:="FindWindow")> _
Public Function FindWindow( _
ByVal lpClassName As String, _
ByVal lpWindowName As String) As IntPtr
End Functiony
Code Snippet<System.Runtime.InteropServices.DllImport("coredll.dll", EntryPoint:="SendMessage")> _
Public Function SendMessage( _
ByVal hWnd As IntPtr, ByVal wMsg As Integer, _
ByVal wParam As Integer, ByVal lParam As Integer) As Integer
End FunctionSalud y suerte!
-
Que tal Toni Recio he realizado lo que me sugieres pero no me ha dado resultado te describo lo que pasa.
Si defino las funciones tal como me indicas me marca error y me dice que tengo que borrar <System.Runtime.InteropServices.DllImport("coredll.dll", EntryPoint:="FindWindow")> lo cual soluciono cambiando Public Function por Private Shared Function, EntryPoint:="FindWindow")> _
Private Shared Function FindWindow( _
ByVal lpClassName As String, _
ByVal lpWindowName As String) As System.IntPtr
End Function
'Declaracion de la funcion SendMessage
<System.Runtime.InteropServices.DllImport(
"coredll.dll", EntryPoint:="SendMessage")> _ Private Shared Function SendMessage( _ ByVal hWnd As IntPtr, ByVal wMsg As Integer, _ ByVal wParam As Integer, ByVal lParam As Integer _)
As Integer End Function'Timer donde encuentro y cierro la aplicacion
Private Sub Timer1_Tick(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Timer1.Tick
Dim ptr As IntPtr = FindWindow(Nothing, "Mensaje")
If ptr.Equals(IntPtr.Zero) Then
Else
Call SendMessage(ptr, WM_SYSCOMMAND, SC_CLOSE, 0)Timer1.Enabled =
False End If End Sub'Boton que abre el mensaje a cerrar
Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.ClickTimer1.Enabled =
TrueMessageBox.Show(
"Articulo", "Mensaje") End SubEspero y me puedan hechar la mano .....hasta luego.
Que tal Jose Miguel, al declarar la funcion tal y como me especifica tony me manda el siguiente error:
System.Runtime.InteropServices.DllImportAttribute cannot be applied to instance method.
Al checar el Error Corrections Options me sugiere borrar
<System.Runtime.InteropServices.DllImport(
"coredll.dll", EntryPoint:="FindWindow")>, es decir que la funcion quede de la siguiente manera:Public
Function FindWindow( _ ByVal lpClassName As String, _ ByVal lpWindowName As String) As System.IntPtr End FunctionSi lo hago me deja de marcar error pero la funcion no se ejecuta correctamente.Lo que hago para solucionarlo es cambiar el Public Function por Private Shared Function y la funcion queda asi:
Private
Shared Function FindWindow( _ ByVal lpClassName As String, _ ByVal lpWindowName As String) As System.IntPtr End FunctionSaludos.....
he probado de crear una clase, y luego llamarla desde un formulario, sólo he probado que compilara y se ejecutara
te adjunto la clase
Code SnippetPublic
Class Class1 Private Const WM_SYSCOMMAND As Integer = &H112 Private Const SC_CLOSE As Integer = &HF060 'Declaracion de las funciones<System.Runtime.InteropServices.DllImport(
"coredll.dll")> _ Private Shared Function FindWindow( _ ByVal lpClassName As String, _ ByVal lpWindowName As String) As System.IntPtr End Function<System.Runtime.InteropServices.DllImport(
"coredll.DLL")> _ Private Shared Function SendMessage(ByVal hWnd As System.IntPtr, ByVal wMsg As Integer, _ ByVal wParam As Integer, ByVal lParam As Integer) As Integer End FunctionMyFuncion =
True End FunctionEnd
ClassY la llamada
Class1.MyFuncion(
"Form2")Dime algo....
En efecto Jose Miguel mi aplicacion al igual que la tuya se compila y se ejecuta perfectamente, el problema se presenta a la hora de mandar llamar la función Sendmessage, ya que esta no esta cerrando la pantalla. Tal vez no se le estan pasando bien los parametros o nose que es lo que pasa pero no termina por cerrar la pantalla.
Saludos.....
perdona, al final nos hemos obsesionado con la declaración no con el contenido... prueba...
Code SnippetPublic Class Class1
Private Const SC_CLOSE As Integer = 10
'Declaracion de las funciones
<System.Runtime.InteropServices.DllImport(
"coredll.dll")> _ Private Shared Function FindWindow( _ ByVal lpClassName As String, _ ByVal lpWindowName As String) As System.IntPtr End Function<System.Runtime.InteropServices.DllImport(
"coredll.DLL")> _ Private Shared Function SendMessageCE(ByVal hWnd As System.IntPtr, ByVal wMsg As Integer, _ ByVal wParam As Integer, ByVal lParam As Integer) As Integer End FunctionMyFuncion =
True End FunctionEnd
ClassUna vez mas te saludo Jose Miguel.
Perdon por no haberte contestado pero me encontraba fuera de la ciudad. He probado las correcciones que sugeriste y no me han dado resultado. Primeramente me marca error en la funcion SendMessageCE:
Can't find a Emtry Point 'SendMessageCE' in a PInvoke DLL 'coredll.dll'
Si dejo el nombre de la funcion a su estado original, es decir, SendMessage se ejecuta correctamente pero sigue sin cerrar la ventana.
Creo que nuestro pequeño error se encuentra dentro de los parametros de la funcion SendMessage, es decir, quiero pensar que el sistema encuentra la funcion dentro de la libreria 'coredll.dll' y la ejecuta pero no correctamente debido a los parametros que tal ves no sean los correctos.
Bueno espero y me puedas segir hechando la mano , saludos........
A pesar que he recorrido mil foros, la respuesta correcta no está.
LA RESPUESTA ESTA AQUI:
ms-help://MS.SSC.v35/MS.SSC.v35.ES/sscprog/html/f3127502-44d2-4cc8-9189-40900b26e8fe.htm
EN LA SECCION Agregar SQL Server Compact 3.5 al proyecto y Configurar SQL Server Compact para la implementación privada
LUEGO DE ÉSTO TE FUNCIONA TODO A MIL........
- Marcado como respuesta Jose Miguel TorresModerator jueves, 5 de abril de 2012 22:25