elhacker.net cabecera Bienvenido(a), Visitante. Por favor Ingresar o Registrarse
¿Perdiste tu email de activación?.

 

 


Tema destacado: Rompecabezas de Bitcoin, Medio millón USD en premios


+  Foro de elhacker.net
|-+  Programación
| |-+  Programación General
| | |-+  .NET (C#, VB.NET, ASP)
| | | |-+  Programación Visual Basic (Moderadores: LeandroA, seba123neo)
| | | | |-+  Dll creada en C (No C++) no se puede acceder desde Visual Basic 6.
0 Usuarios y 1 Visitante están viendo este tema.
Páginas: [1] 2 Ir Abajo Respuesta Imprimir
Autor Tema: Dll creada en C (No C++) no se puede acceder desde Visual Basic 6.  (Leído 5,232 veces)
fmurgueytio

Desconectado Desconectado

Mensajes: 6


Ver Perfil
Dll creada en C (No C++) no se puede acceder desde Visual Basic 6.
« en: 23 Mayo 2012, 19:16 pm »

23.05.2012. Buenos días, Tengo el siguiente problema, que espero me puedan ayudar a solucionar.

Un proveedor nos ha hecho llegar una dll que según me indican esta generada en C, no C++ ni C#, sucede que al querer referenciarla desde el Visual Basic me bota el siguiente error: "No se puede agregar una referencia al archivo especificado" y esto entiendo es por que seguramente esta dll no es un componente COM.

Pensé que quizás la dll podría estar dañada, por lo que utilicé un archivo .lib y un .h que me vino en un archivo .ZIP junto con la dll, cree un proyecto en C++ y logre generar una nueva DLL sin problemas, el tema está en que al querer utilizarla referenciandola como una API me da el error: 53 en tiempo de ejecución: No se ha encontrado el archivo Dataprint.dll", a pesar de que le he puesto la ruta completa donde se encuentra el archivo y que también lo he copiado en c:\Windows\System.


Private Declare Function CPSC1900Connect Lib "d:\Imprimir\DataPrint.dll" Alias "CPSC1900Connect@8" (ByVal port As Byte, ByVal param As String)

Ahora ya no se que mas hacer  para poder utilizar las funciones de la dll, favor espero su ayuda con algún dato que me pueda ayudar a solucionar este inconveniente.

Saludos.


Ah me olvide indicar que esto lo he probado con S.O Windows XP y también sobre Windows 7.

Gracias por su apoyo.


« Última modificación: 23 Mayo 2012, 21:03 pm por raul338 » En línea

HdM


Desconectado Desconectado

Mensajes: 1.674



Ver Perfil
Re: Dll creada en C (No C++) no se puede acceder desde Visual Basic 6.
« Respuesta #1 en: 23 Mayo 2012, 19:38 pm »

Buenas.

Imagino que tendrás que poner la dll, en el path donde se encuentren los fuentes de tu sw (no hace falta que pongas la ruta completa del archivo).

Lo del error 53, es debido a que estás en debug desde el IDE del VB. Compila y debería funcionarte.

Saludos.


En línea

- Nice to see you again -
raul338


Desconectado Desconectado

Mensajes: 2.633


La sonrisa es la mejor forma de afrontar las cosas


Ver Perfil WWW
Re: Dll creada en C (No C++) no se puede acceder desde Visual Basic 6.
« Respuesta #2 en: 23 Mayo 2012, 21:03 pm »

Si no son funciones exportadas, no se pueden llamar desde visual basic :(
En línea

fmurgueytio

Desconectado Desconectado

Mensajes: 6


Ver Perfil
Re: Dll creada en C (No C++) no se puede acceder desde Visual Basic 6.
« Respuesta #3 en: 23 Mayo 2012, 22:03 pm »

Raúl, Imagino, que para declarar las funciones como exportadas debo de volver a generar la dll pero desde los fuentes, correcto?

Porque yo tengo un archivo .lib y como digo intenté generando una nueva dll a partir de ese archivo y el archivo de cabecera que me entregaron pero nada.

Gracias Bulld0z3r también por tu respuesta.

Saludos.
En línea

MCKSys Argentina
Moderador Global
***
Desconectado Desconectado

Mensajes: 4.969


Diviértete crackeando, que para eso estamos!


Ver Perfil
Re: Dll creada en C (No C++) no se puede acceder desde Visual Basic 6.
« Respuesta #4 en: 23 Mayo 2012, 22:15 pm »

Si no son funciones exportadas, no se pueden llamar desde visual basic :(
Ademas de esto, deben estar declaradas con STDCALL calling convention. Sino tampoco van a funcionar a menos que hagas un wrapper para poder hacerlo...
En línea

MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."

fmurgueytio

Desconectado Desconectado

Mensajes: 6


Ver Perfil
Re: Dll creada en C (No C++) no se puede acceder desde Visual Basic 6.
« Respuesta #5 en: 23 Mayo 2012, 22:31 pm »

Gracias por la respuesta MCKSys Argentina. Mira este es parte del código que encontré en el archivo .h que me entregaron. Por lo que veo las funciones están exportadas y declaradas como __stdcall. Y con este archivo y con el .lib genero una nueva dll desde un proyecto en microsoft visual c++ pero nada, no la echo a andar desde visual 6....

Respecto a hacer un wrapper, ahi si no comento porque no tengo la mínima idea de como hacerlo, es como decirte que me estuvieras hablando en chino mandarin... jeje... Gracias de todas maneras por tu tiempo.
Código:
////////////////////////////////////////////////////////////////////////////////
// Exported Functions
////////////////////////////////////////////////////////////////////////////////

// Connection
CPSC1900DllExport BYTE __stdcall CPSC1900Connect(BYTE port, void *param);
CPSC1900DllExport BYTE __stdcall CPSC1900Disconnect(void);

// Command Control
//Demo Card
CPSC1900DllExport BYTE __stdcall CPSC1900MakeDemoCard(BOOL withMagStripe);
//Status and Reset
CPSC1900DllExport BYTE __stdcall CPSC1900DeviceReset(void);
CPSC1900DllExport BYTE __stdcall CPSC1900DeviceStatus(BYTE moduleID,
BYTE *p1, BYTE *p2, BYTE *p3, BYTE *p4, BYTE *p5);
CPSC1900DllExport BYTE __stdcall CPSC1900DeviceIdentify(BYTE moduleID,
BYTE *identify);
CPSC1900DllExport BYTE __stdcall CPSC1900ReadCounters(
LPSTCARDCOUNTER stCardCounters);
CPSC1900DllExport BYTE __stdcall CPSC1900ResetCounters(
BYTE *password);
CPSC1900DllExport BYTE __stdcall CPSC1900ReadEncoderTrackStatus(BYTE *t1RC,
BYTE *t2RC, BYTE *t3RC);
//Feeder [I/O Card]
CPSC1900DllExport BYTE __stdcall CPSC1900FeedCard(void);
CPSC1900DllExport BYTE __stdcall CPSC1900RejectCard(BYTE rejectTO);
CPSC1900DllExport BYTE __stdcall CPSC1900EjectCard(BYTE ejectTO);
//ChipCard
CPSC1900DllExport BYTE __stdcall CPSC1900ChipcardMoveTO(BYTE chipCardFormat);
//Embosser
CPSC1900DllExport BYTE __stdcall CPSC1900EmbosserCleanLineData(void);
CPSC1900DllExport BYTE __stdcall CPSC1900EmbosserDownloadLineData(
LPSTEMBOSSERLINEDATA stEmbosserLineData);
CPSC1900DllExport BYTE __stdcall CPSC1900EmbosserEmbossLines(BOOL postTopper);
//Encoder
CPSC1900DllExport BYTE __stdcall CPSC1900EncoderDownloadData(
LPSTENCODERDATA stEncoderData);
CPSC1900DllExport BYTE __stdcall CPSC1900EncoderWriteTracks(void);
CPSC1900DllExport BYTE __stdcall CPSC1900EncoderReadTracks(BYTE t3Mode,
LPSTENCODERREADTRACK stEncoderReadTrack);
//Topper
CPSC1900DllExport BYTE __stdcall CPSC1900TopperPressCard(BOOL waitTempReady,
BYTE secondToWait);
CPSC1900DllExport BYTE __stdcall CPSC1900TopperDetectTemp(BYTE *temperature);
CPSC1900DllExport BYTE __stdcall CPSC1900TopperSelectRibbon(BYTE ribbon);
// Setup
//SerialNumber
CPSC1900DllExport BYTE __stdcall
CPSC1900SETUPMasterSetSerialNumber(BYTE *serialNumber, BYTE *macAddress);
CPSC1900DllExport BYTE __stdcall
CPSC1900SETUPMasterGetSerialNumber(BYTE *serialNumber, BYTE *macAddress);
//ChipCard
CPSC1900DllExport BYTE __stdcall
CPSC1900SETUPChipcardSetContactPosition(WORD offsetX, WORD offsetY);
CPSC1900DllExport BYTE __stdcall
CPSC1900SETUPChipcardGetContactPosition(WORD *offsetX, WORD *offsetY);
//Topping
« Última modificación: 23 Mayo 2012, 23:10 pm por raul338 » En línea

MCKSys Argentina
Moderador Global
***
Desconectado Desconectado

Mensajes: 4.969


Diviértete crackeando, que para eso estamos!


Ver Perfil
Re: Dll creada en C (No C++) no se puede acceder desde Visual Basic 6.
« Respuesta #6 en: 23 Mayo 2012, 22:49 pm »

Probaste cambiando la declaracion:

Private Declare Function CPSC1900Connect Lib "d:\Imprimir\DataPrint.dll" Alias "CPSC1900Connect@8" (ByVal port As Byte, ByVal param As String)

a esta?

Private Declare Function CPSC1900Connect Lib "d:\Imprimir\DataPrint.dll" (ByVal port As Byte, ByVal param As String)

Quizas es por el Alias...
En línea

MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."

fmurgueytio

Desconectado Desconectado

Mensajes: 6


Ver Perfil
Re: Dll creada en C (No C++) no se puede acceder desde Visual Basic 6.
« Respuesta #7 en: 23 Mayo 2012, 23:02 pm »

Acabo de probarlo y nada, sigue apareciendo el mensaje que no encontró el archivo.

Lo raro es que pude verificar con el programa alternative dll analizer que si existen funciones dentro de la dll. Aqui el listado que me devuelve el programa...

_CPSC1900AbortCommand@0
_CPSC1900AcceptCard@4
_CPSC1900BeginDownProcess@24
_CPSC1900ChipcardMoveTO@4
_CPSC1900CleaningCardProcess@0
_CPSC1900Connect@8
_CPSC1900CountTray@8
_CPSC1900DeviceIdentify@8
_CPSC1900DeviceReset@0
_CPSC1900DeviceStatus@24
_CPSC1900DiaAllSensorStatus@4
_CPSC1900DiaGetEncoderStrobeData@12
_CPSC1900DiaGetEncoderT1Data@12
_CPSC1900DiaGetEncoderT2Data@12
_CPSC1900DiaGetEncoderT3Data@12
_CPSC1900DiaPowerOFFStepperMotors@0
_CPSC1900DiaRunWithoutCard@4
_CPSC1900DiaSensorStatus@8
_CPSC1900DiaSingleReset@4
_CPSC1900DiaSwitchToDiagnosticMode@4

Y en el visual basic 6 al definir la función "_CPSC1900Connect@8" no me soporta ni el caracter "_" que está delante de la función, ni el caracter "@" porque me indica que debe ir la instrucción "lib". asi que tengo que definirla como "CPSC1900Connect"

Que problema... ojala alguien pudiera ayudarme a resolverlo.
En línea

MCKSys Argentina
Moderador Global
***
Desconectado Desconectado

Mensajes: 4.969


Diviértete crackeando, que para eso estamos!


Ver Perfil
Re: Dll creada en C (No C++) no se puede acceder desde Visual Basic 6.
« Respuesta #8 en: 23 Mayo 2012, 23:16 pm »

Puedes probar quitando el path de la DLL y creando un EXE.

Asi verificas si no es por el IDE de VB

PD: Copia la DLL al folder del EXE
En línea

MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."

MCKSys Argentina
Moderador Global
***
Desconectado Desconectado

Mensajes: 4.969


Diviértete crackeando, que para eso estamos!


Ver Perfil
Re: Dll creada en C (No C++) no se puede acceder desde Visual Basic 6.
« Respuesta #9 en: 23 Mayo 2012, 23:20 pm »

Si no funciona esto ultimo, es porque las entradas estan en cdecl y no en stdcall.

Con el programa Dependency Viewer o Walker (no recuerdo bien el nombre) que traer el VS 6 puedes verlo: si tienen "decorado" (los caracteres raros que aparecen en el nombre) estan exportadas como cdecl y no puedes usarlas desde VB directamente.
En línea

MCKSys Argentina

"Si piensas que algo está bien sólo porque todo el mundo lo cree, no estás pensando."

Páginas: [1] 2 Ir Arriba Respuesta Imprimir 

Ir a:  

WAP2 - Aviso Legal - Powered by SMF 1.1.21 | SMF © 2006-2008, Simple Machines