Autor
|
Tema: Dll creada en C (No C++) no se puede acceder desde Visual Basic 6. (Leído 6,816 veces)
|
fmurgueytio
Desconectado
Mensajes: 6
|
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
Mensajes: 1.674
|
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
Mensajes: 2.633
La sonrisa es la mejor forma de afrontar las cosas
|
Si no son funciones exportadas, no se pueden llamar desde visual basic
|
|
|
En línea
|
|
|
|
fmurgueytio
Desconectado
Mensajes: 6
|
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
|
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
Mensajes: 6
|
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. //////////////////////////////////////////////////////////////////////////////// // 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
|
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
Mensajes: 6
|
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
|
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
|
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."
|
|
|
|
Mensajes similares |
|
Asunto |
Iniciado por |
Respuestas |
Vistas |
Último mensaje |
|
|
Como acceder a una red mediante Visual Basic
Programación Visual Basic
|
kakinets
|
3
|
2,083
|
7 Agosto 2005, 00:42 am
por Slasher-K
|
|
|
Correo desde Visual Basic????
« 1 2 3 »
Programación Visual Basic
|
CeLaYa
|
20
|
29,186
|
23 Abril 2008, 22:05 pm
por Pox1
|
|
|
enviar sms por visual basic 6,... se puede?
Programación Visual Basic
|
Petro_Boca
|
3
|
6,974
|
14 Febrero 2010, 20:34 pm
por Asphyxia
|
|
|
Acceder a una clase desde VISUAL C++ con Forms ¿como?
Programación C/C++
|
ApOkAlizE
|
0
|
1,939
|
5 Abril 2012, 02:21 am
por ApOkAlizE
|
|
|
[SOLUCIONADO] No se puede acceder a ip publica desde terminal centos 7, pero...
GNU/Linux
|
jhonatanAsm
|
0
|
1,873
|
31 Julio 2016, 22:58 pm
por jhonatanAsm
|
|