Trabajar con Funciones de DLL

Iniciado por my_sistemas, 12 Marzo 2011, 00:37 AM

0 Miembros y 1 Visitante están viendo este tema.

my_sistemas

Buenas noches, estoy tratando de hacer un software que use las funciones establecidas en una DLL, dicha DLL no fue creada por mi ni tengo el source, pero pude ver su contenido usando ciertos programas, siendo su contenido el siguiente.


//BBCFPCOM 1.0 Type Library
//Version: 1.0
BBCFPCOMLib;
GUID = {C2CFDD51-0603-4889-9FF5-B943AA46118B};


Enum CFP_TYPE;
  CFP_TYPE_NORMAL = 0;
  CFP_TYPE_PATRIOT = 1;
  CFP_TYPE_EDW = 2;
  CFP_TYPE_RMA = 3;
  CFP_TYPE_STP = 4;
  CFP_TYPE_BRL = 5;

//CFPGRSCOM Class
CoClass CFPGRSCOM;
GUID = {3B5626A7-724D-4F17-A980-002FDC26B567};

//BBCFPCOM 1.0 Type Library
Interface ICFPGRSCOM;
GUID = {33CF20BC-B452-4529-B78E-B48E821AF3A8};
  //Connect to Any USB device found
  function ConnectAnyUSB(nMaxTimeoutMs: I4; nResetTimeOutMs: I4): HResult; stdcall;
  //method ConnectToBootImage
  function ConnectToBootImage: HResult; stdcall;
  //Erase files and OS
  function Wipe(bWipeOS: Bool): HResult; stdcall;


Entonces por lo que veo dicha DLL (Desarrollada en .NET) Tiene las siguientes funciones:
-ConnectAnyUSB
-ConnectToBootImage
-Wipe

Necesito usar dichas funciones, pero no logro hacerlo.

Hice un nuevo proyecto en Visual Basic 6, registre dicha DLL y la agregue como referencia en mi proyecto.
Lugo hice el siguiente code:

Dim CFP As BBCFPCOMLib.CFPGRSCOM

Private Sub Command1_Click()
Set CFP = New BBCFPCOMLib.CFPGRSCOM
CFP.ConnectAnyUSB 50, 50
CFP.ConnectToBootImage
End Sub



Dandome error de Timeout en ConnectToBootImage, cuando dicha funcion no tiene TimeOut.

Tambien intente llamando a la DLL desde un modulo:

Public Declare Function ConnectToBootImage Lib "BBCFPCOM.dll" ()
Public Declare Function ConnectAnyUSB Lib "BBCFPCOM.dll" (ByVal nMaxTimeoutMs As Integer, ByVal nResetTimeOutMs As Integer)


y luego haciendo la llamada desde dicha DLL

Private Sub Command1_Click()
Call Module1.ConnectAnyUSB(50, 0)
Call Module1.ConnectToBootImage
End Sub


Y ahora me muestra que:
"Can't Find DLL entry point ConnectAnyUSB in BBCFPCOM.dll"
me dice que no encuentra dicha funcion, pero si presiono F2 si aparece como una funcion de dicha DLL.

Descarga la DLL
http://www.megaupload.com/?d=P24K7EPM
cuando uno es grande...
la calidad nunca la pierde...

my_sistemas

Ahora agregue la DLL como referencia en el proyecto y escribi el siguiente codigo:


Option Explicit
Private Declare Sub InitCommonControls Lib "comctl32.dll" ()
Private WithEvents frmNET As BBCFPCOMLib.CFPGRSCOM

Private Sub Command1_Click()
Set frmNET = New CFPGRSCOM
frmNET.ConnectAnyUSB 50, 0
frmNET.ConnectToBootImage
End Sub


Y se me queda colgada la PC al momento de ConnectAnyUSB, alguna ayuda?? tengo windows 7, formateare y pondre winxp para ver qe tal.
cuando uno es grande...
la calidad nunca la pierde...

my_sistemas

Cmbie a Visual Basic .NET y ahora si me reconoce la interface ICFPGRSCOM


Public Class Form1
    Private Declare Sub InitCommonControls Lib "comctl32.dll" ()
    Dim CFP As BBCFPCOMLib.ICFPGRSCOM
    Private Sub Button1_Click(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles Button1.Click
        CFP.ConnectAnyUSB(50, 0)
    End Sub
End Class


Pero ahora me da un error con el CFP.
No se controlo NullReferenceException
Referencia a objeto no establecida como instancia de un objeto
cuando uno es grande...
la calidad nunca la pierde...

seba123neo

sera que te falta instanciar el objeto CFP con la palabra New, ahi solo la declaraste.

PD: esa api InitCommonControls no es necesaria en .NET
La característica extraordinaria de las leyes de la física es que se aplican en todos lados, sea que tú elijas o no creer en ellas. Lo bueno de las ciencias es que siempre tienen la verdad, quieras creerla o no.

Neil deGrasse Tyson

my_sistemas

ese es el detalle... que no me deja poner:

Dim cfp As New BBCFPCOMLib.ICFPGRSCOM

Ya que NEW no se puede utilizar en una interfaz
cuando uno es grande...
la calidad nunca la pierde...

my_sistemas


'New' cannot be used on an interface

Instrucción Dim (Visual Basic) utiliza una cláusula New (Visual Basic) al declarar una variable para que sea de un tipo de interfaz.

Aunque una interfaz es un tipo de referencia, no puede crear una instancia de él. Sólo puede utilizar New para crear una instancia de una clase o una estructura.

Identificador de error: BC30375

Para corregir este error
1.Si la variable va a ser de un tipo de interfaz, quite la palabra clave New.

2.Si la variable va a hacer referencia a una instancia, declárela para que sea de una clase o un tipo de estructura. Conserve la palabra clave New para crear una instancia.

FUENTE: MSDN

Mas no entiendo dicha solucion
cuando uno es grande...
la calidad nunca la pierde...

BlackZeroX

#6
.
Que idiotes puse :'(
The Dark Shadow is my passion.

seba123neo

perdona no sabia que era una interfaz, recien me bajo la libreria y lo vi, no estoy seguro pero creo que debes implementarla asi:

Código (vbnet) [Seleccionar]
Imports BBCFPCOMLib

Public Class Form1

    Private Sub Form1_Load(ByVal sender As System.Object, ByVal e As System.EventArgs) Handles MyBase.Load
        Dim ser As New Libreria
        ser.ConnectAnyUSB(50, 0)
    End Sub
End Class

Public Class Libreria

    Implements BBCFPCOMLib.CFPGRSCOM

    Public Event OnDebugMessage(ByVal nLogLevel As Integer, ByVal bstrMessage As String) Implements BBCFPCOMLib._ICFPEvents_Event.OnDebugMessage

    Public Event OnNeedPassword(ByVal nTriesRemaining As Integer, ByRef password As String) Implements BBCFPCOMLib._ICFPEvents_Event.OnNeedPassword

    Public Event OnProgress(ByVal bstrCode As String, ByVal nPercent As Integer, ByVal ulExtraInfo As UInteger) Implements BBCFPCOMLib._ICFPEvents_Event.OnProgress

    Public Sub Abort() Implements BBCFPCOMLib.ICFPGRSCOM.Abort

    End Sub

    Public Sub Connect(ByVal nComport As Integer, ByVal nConnectBaudRate As Integer, ByVal nMaxTimeoutMs As Integer, ByVal nResetTimeOusMs As Integer) Implements BBCFPCOMLib.ICFPGRSCOM.Connect

    End Sub

    Public Sub ConnectAnyUSB(ByVal nMaxTimeoutMs As Integer, ByVal nResetTimeOutMs As Integer) Implements BBCFPCOMLib.ICFPGRSCOM.ConnectAnyUSB

    End Sub

    Public Sub ConnectToBootImage() Implements BBCFPCOMLib.ICFPGRSCOM.ConnectToBootImage

    End Sub

    Public Sub ConnectToBootrom() Implements BBCFPCOMLib.ICFPGRSCOM.ConnectToBootrom

    End Sub

    Public Property ConnectType() As BBCFPCOMLib.CFP_TYPE Implements BBCFPCOMLib.ICFPGRSCOM.ConnectType
        Get

        End Get
        Set(ByVal value As BBCFPCOMLib.CFP_TYPE)

        End Set
    End Property

    Public Sub ConnectUSB(ByVal bstrProperty As String, ByVal bstrValue As String, ByVal nMaxTimeoutMs As Integer, ByVal nResetTimoeOutMs As Integer) Implements BBCFPCOMLib.ICFPGRSCOM.ConnectUSB

    End Sub

    Public Sub Disconnect1() Implements BBCFPCOMLib.ICFPGRSCOM.Disconnect

    End Sub

    Public Sub GetBootromInfo(ByRef pulBRver As UInteger, ByRef pbSecurityEnabled As Boolean) Implements BBCFPCOMLib.ICFPGRSCOM.GetBootromInfo

    End Sub

    Public Sub GetCFPVersion(ByRef pulCFPver As UInteger) Implements BBCFPCOMLib.ICFPGRSCOM.GetCFPVersion

    End Sub

    Public Function GetCOMBuildVersion() As String Implements BBCFPCOMLib.ICFPGRSCOM.GetCOMBuildVersion

    End Function

    Public Function GetCOMBuildVersionID() As UInteger Implements BBCFPCOMLib.ICFPGRSCOM.GetCOMBuildVersionID

    End Function

    Public Function GetFlashSizeInBytes() As UInteger Implements BBCFPCOMLib.ICFPGRSCOM.GetFlashSizeInBytes

    End Function

    Public Sub GetOSVersionOfSFI(ByVal bstrFileName As String, ByRef pulOSver As UInteger) Implements BBCFPCOMLib.ICFPGRSCOM.GetOSVersionOfSFI

    End Sub

    Public Sub GetOSVersionOfSFIEx(ByVal bstrFileName As String, ByRef pulOSver As UInteger, ByRef pbstrOSver As String) Implements BBCFPCOMLib.ICFPGRSCOM.GetOSVersionOfSFIEx

    End Sub

    Public Function GetPatriotVersion() As String Implements BBCFPCOMLib.ICFPGRSCOM.GetPatriotVersion

    End Function

    Public Sub GetPlatformID(ByRef pulPID As UInteger, ByRef pbstrDeviceString As String) Implements BBCFPCOMLib.ICFPGRSCOM.GetPlatformID

    End Sub

    Public Sub GetSFIOSVersionPlatID(ByVal bstrFileName As String, ByRef pulOSver As UInteger, ByRef pulPlatID As UInteger) Implements BBCFPCOMLib.ICFPGRSCOM.GetSFIOSVersionPlatID

    End Sub

    Public Function GetSupportedBands() As UInteger Implements BBCFPCOMLib.ICFPGRSCOM.GetSupportedBands

    End Function

    Public Function GetVendorID() As UShort Implements BBCFPCOMLib.ICFPGRSCOM.GetVendorID

    End Function

    Public Sub GetVersionOfAPPfile(ByVal bstrFileName As String, ByRef pbstrAPPversion As String, ByRef pbVersionValid As Boolean, ByRef pbstrAppNumber As String, ByRef pbNumberValid As Boolean) Implements BBCFPCOMLib.ICFPGRSCOM.GetVersionOfAPPfile

    End Sub

    Public Sub HeadInTheSandMode(ByVal bChangeMode As Boolean, ByRef pbHISMode As Boolean) Implements BBCFPCOMLib.ICFPGRSCOM.HeadInTheSandMode

    End Sub

    Public Sub InvokeMethod(ByVal bstrMethod As String, ByRef pulParam As UInteger, ByRef pbstrParam As String) Implements BBCFPCOMLib.ICFPGRSCOM.InvokeMethod

    End Sub

    Public Function IsDesktopRAMImage() As Boolean Implements BBCFPCOMLib.ICFPGRSCOM.IsDesktopRAMImage

    End Function

    Public Sub LoadBootrom(ByVal bstrFileName As String) Implements BBCFPCOMLib.ICFPGRSCOM.LoadBootrom

    End Sub

    Public Sub NukeDevice() Implements BBCFPCOMLib.ICFPGRSCOM.NukeDevice

    End Sub

    Public Sub PatriotConnectToTunnel() Implements BBCFPCOMLib.ICFPGRSCOM.PatriotConnectToTunnel

    End Sub

    Public Sub PatriotDisconnect() Implements BBCFPCOMLib.ICFPGRSCOM.PatriotDisconnect

    End Sub

    Public Sub PatriotGetInfo(ByRef pulPATver As UInteger, ByRef pulTunnelver As UInteger, ByRef pbBatteryVoltageOk As Boolean) Implements BBCFPCOMLib.ICFPGRSCOM.PatriotGetInfo

    End Sub

    Public Sub PatriotGetOSVersionOfFile(ByVal bstrFileName As String, ByRef pulOSver As UInteger) Implements BBCFPCOMLib.ICFPGRSCOM.PatriotGetOSVersionOfFile

    End Sub

    Public Function PatriotGetOSVersionOfFileStr(ByVal bstrFileName As String) As String Implements BBCFPCOMLib.ICFPGRSCOM.PatriotGetOSVersionOfFileStr

    End Function

    Public Function PatriotInBerbugMode() As Boolean Implements BBCFPCOMLib.ICFPGRSCOM.PatriotInBerbugMode

    End Function

    Public Sub PatriotLastLoadSuccessful(ByRef pbSuccess As Boolean) Implements BBCFPCOMLib.ICFPGRSCOM.PatriotLastLoadSuccessful

    End Sub

    Public Sub PatriotLoadImage(ByVal bstrFileName As String) Implements BBCFPCOMLib.ICFPGRSCOM.PatriotLoadImage

    End Sub

    Public Sub ReloadFileSystem(ByVal bstrFileName As String) Implements BBCFPCOMLib.ICFPGRSCOM.ReloadFileSystem

    End Sub

    Public Sub ReloadOS(ByVal bstrFileName As String) Implements BBCFPCOMLib.ICFPGRSCOM.ReloadOS

    End Sub

    Public Sub ReloadPlantImage(ByVal bstrFileName As String) Implements BBCFPCOMLib.ICFPGRSCOM.ReloadPlantImage

    End Sub

    Public Sub ReloadPlantImageWithPatriot(ByVal bstrFileName As String) Implements BBCFPCOMLib.ICFPGRSCOM.ReloadPlantImageWithPatriot

    End Sub

    Public Sub ResetPatriot() Implements BBCFPCOMLib.ICFPGRSCOM.ResetPatriot

    End Sub

    Public Sub SaveFileSystem(ByVal bstrFileName As String, ByVal bVerifyToAPP As Boolean) Implements BBCFPCOMLib.ICFPGRSCOM.SaveFileSystem

    End Sub

    Public Sub SetConnectValues(ByVal nMaxTimeoutMs As Integer, ByVal bIncremental As Boolean) Implements BBCFPCOMLib.ICFPGRSCOM.SetConnectValues

    End Sub

    Public Sub SetMassStorage(ByVal nOn As Integer) Implements BBCFPCOMLib.ICFPGRSCOM.SetMassStorage

    End Sub

    Public Sub SuperNukeDevice() Implements BBCFPCOMLib.ICFPGRSCOM.SuperNukeDevice

    End Sub

    Public Sub ToastDevice(ByVal bstrPassword As String) Implements BBCFPCOMLib.ICFPGRSCOM.ToastDevice

    End Sub

    Public Sub WhoAmI(ByVal bstrWhoAmI As String) Implements BBCFPCOMLib.ICFPGRSCOM.WhoAmI

    End Sub

    Public Sub Wipe(ByVal bWipeOS As Boolean) Implements BBCFPCOMLib.ICFPGRSCOM.Wipe

    End Sub
End Class


todas esas funciones son las que tiene la dll dentro, no las escribi yo, me las detecto y escribio automaticamente el visual studio cuando implemente de BBCFPCOMLib.CFPGRSCOM

saludos.
La característica extraordinaria de las leyes de la física es que se aplican en todos lados, sea que tú elijas o no creer en ellas. Lo bueno de las ciencias es que siempre tienen la verdad, quieras creerla o no.

Neil deGrasse Tyson

my_sistemas

Hola, gracias por tu respuesta pero por alguna razon no me esta haciendo nada el programa, es decir, no hace ninguna funcion ni lanza ningun errror
cuando uno es grande...
la calidad nunca la pierde...

raul338

Cita de: e-spy en 12 Marzo 2011, 07:05 AM
Hola, gracias por tu respuesta pero por alguna razon no me esta haciendo nada el programa, es decir, no hace ninguna funcion ni lanza ningun errror

Porque esta implementando la interfaz, en una clase vacia, fijate la documentacion de la libreria haber que tienes que hacer en cada evento