none
Registrar DLL RRS feed

  • 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 c1
     
    Mi 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.......
    lunes, 17 de septiembre de 2007 18:03

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........

    sábado, 17 de marzo de 2012 17:57

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!

     

    martes, 18 de septiembre de 2007 5:04
  • 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

     

    martes, 18 de septiembre de 2007 6:32
    Moderador
  • 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 ejemplo
    Code 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.

    martes, 18 de septiembre de 2007 10:18
  •  

    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.

    martes, 18 de septiembre de 2007 14:40
  • 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 Function

     

     

    y

     

    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 Function

     

     

     

    Salud y suerte!

     

     

    martes, 18 de septiembre de 2007 14:45
  • 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.Click

    Timer1.Enabled = True

    MessageBox.Show("Articulo", "Mensaje")

    End Sub

     

     

    Espero y me puedan hechar la mano .....hasta luego.

    martes, 18 de septiembre de 2007 23:59
  • La declaración de que te especifica Toni es correcta. Podrías concretar con "me marca error y me dice que tengo que borrar  "

     

    saludos

     

    miércoles, 19 de septiembre de 2007 15:23
    Moderador
  •  

    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 Function

     

    Si 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 Function

     

    Saludos.....

    miércoles, 19 de septiembre de 2007 16:10
  • hola piedra, voy a probarlo y te digo algo...

     

    jueves, 20 de septiembre de 2007 6:17
    Moderador
  • 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 Snippet

    Public 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 Function

     

     

    Public Shared Function MyFuncion(ByVal strMensaje As String) As Boolean

    'Y esta es es la manera en que las mando llamar

    Dim ptr As IntPtr = FindWindow(Nothing, strMensaje)

    If ptr.Equals(IntPtr.Zero) Then

    Else

    Call SendMessage(ptr, WM_SYSCOMMAND, SC_CLOSE, 0)

    End If

    'por ejemplo

    MyFuncion = True

    End Function

    End Class

     

     

    Y la llamada

     

    Class1.MyFuncion("Form2")

     

    Dime algo....

    jueves, 20 de septiembre de 2007 6:45
    Moderador
  •  

    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.....

    viernes, 21 de septiembre de 2007 15:39
  •  

    perdona, al final nos hemos obsesionado con la declaración no con el contenido... prueba...

    Code Snippet

    Public 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 Function

     

     

    Public Shared Function MyFuncion(ByVal strMensaje As String) As Boolean

    'Y esta es es la manera en que las mando llamar

    Dim ptr As IntPtr = FindWindow(Nothing, strMensaje)

    If ptr.Equals(IntPtr.Zero) Then

    Else

    Call SendMessageCE(ptr, SC_CLOSE, 0, 0)

    End If

    'por ejemplo

    MyFuncion = True

    End Function

    End Class

     

     

    viernes, 21 de septiembre de 2007 20:04
    Moderador
  • Una 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........

    jueves, 27 de septiembre de 2007 16:32
  • 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........

    sábado, 17 de marzo de 2012 17:57