Hola a todos, quería saber que es lo que está mal en este código en C++. Tengo un PIC18F4550 conectado por USB en modo HID, totalmente funcional con una aplicacion en VB. Ahora, el problema surge cuando intento armar la aplicacion, pero en C++. Logro inicializar la DLL, obtener su versión, y ver la cantidad de dispositivos conectados, pero al intentar abrir las pipes, nada pasa. Siempre me devuelve INVALID_HANDLE_VALUE (-1), y no logro pasar de ahi. Intenté varias cosas, cambiar el VID_PID de mayúsculas a minúsculas, lo mismo con el EndPoint, pero NADA.
Adjunto acá el código.
Aviso que cualquiera puede usar este código, sin restricción alguna, pero haciendo que funcione, jaja.
Bueno, espero, puedan ayudarme.
Adjunto acá el código.
Código:
#include <windows.h>
#include <stdio.h>
#include <iostream>
using namespace std;
typedef DWORD (__cdecl *MPUSBGetDeviceCount) (string pVID_PID);
typedef void* (__cdecl *MPUSBOpen) (DWORD instance, string pVID_PID, string pEP, DWORD dwDir, DWORD dwReserved);
typedef DWORD (__cdecl *MPUSBRW) (void* handle, void* pData, DWORD dwLen, DWORD* pLength, DWORD dwMilliseconds);
//typedef DWORD (__cdecl *MPUSBWrite) (void* handle, void* pData, DWORD dwLen, DWORD* pLength, DWORD dwMilliseconds); //Se utiliza MPUSBRW
typedef DWORD (__cdecl *MPUSBReadInt) (void* handle, DWORD* pData, DWORD dwLen, DWORD* pLength, DWORD dwMilliseconds);
typedef bool (__cdecl *MPUSBClose) (void* handle);
void ConvertirVersion(DWORD VerGET, BYTE* VerPARSE);
void SendPacket(BYTE* SendData, DWORD SendLength);
void ReceivePacket(byte* ReceiveData, DWORD* ReceiveLength);
void AbrirPipes(void);
void CerrarPipes(void);
bool ErrorHandler(DWORD dwCodigo);
//Declaraciones globales
BYTE VersionDLL[4]; //Variable para la version de la DLL.
DWORD err; //Contador de errores.
HINSTANCE hDLL; //HANDLE a la DLL.
void* hUSB_DeviceOut; //HANDLE al dispositivo USB (Salida)
void* hUSB_DeviceInp; //HANDLE al dispositivo USB (Entrada)
FARPROC USB_GetDLLVersion; //Funcion
MPUSBGetDeviceCount USB_GetDeviceCount; //Funcion
MPUSBOpen USB_Open; //Funcion
MPUSBRW USB_Read; //Funcion
MPUSBRW USB_Write; //Funcion
MPUSBReadInt USB_ReadInt; //Funcion
MPUSBClose USB_Close; //Funcion
string VID_PID = "vid_0925&pid_1231"; //VID y PID del dispositivo
string out_pipe = "\\MCHP_EP1"; //EndPoint de salida a usar
string inp_pipe = "\\MCHP_EP1"; //EndPoint de entrada a usar
int main(int argc, char* argv[])
{
hDLL = LoadLibrary(L"mpusbapi");
if(hDLL != NULL)
cout << "Dll cargada con exito" << endl;
else
ErrorHandler(GetLastError());
USB_GetDLLVersion = (FARPROC) GetProcAddress(HMODULE (hDLL), "_MPUSBGetDLLVersion");
USB_GetDeviceCount = (MPUSBGetDeviceCount) GetProcAddress(HMODULE (hDLL), "_MPUSBGetDeviceCount");
USB_Open = (MPUSBOpen) GetProcAddress(HMODULE (hDLL), "_MPUSBOpen");
USB_Read = (MPUSBRW) GetProcAddress(HMODULE (hDLL), "_MPUSBRead");
USB_Write = (MPUSBRW) GetProcAddress(HMODULE (hDLL), "_MPUSBWrite");
USB_ReadInt = (MPUSBReadInt) GetProcAddress(HMODULE (hDLL), "_MPUSBReadInt");
USB_Close = (MPUSBClose) GetProcAddress(HMODULE (hDLL), "_MPUSBClose");
#ifdef DEBUG-DLL
cout << "1 - " << USB_GetDLLVersion << endl;
cout << "2 - " << USB_GetDeviceCount << endl;
cout << "3 - " << USB_Open << endl;
cout << "4 - " << USB_Read << endl;
cout << "5 - " << USB_Write << endl;
cout << "6 - " << USB_ReadInt << endl;
cout << "7 - " << USB_Close << endl;
#endif
ConvertirVersion(USB_GetDLLVersion(), VersionDLL);
printf("MPUSBAPI.DLL version: %u,%u,%u,%u\r\n",VersionDLL[0],VersionDLL[1],VersionDLL[2],VersionDLL[3]);
system("pause");
#ifdef VER-ERR
cout << "Verificando ultimo error..." << endl;
err = GetLastError();
if(err != NULL)
ErrorHandler(err);
else
cout << "No hay errores.\n" << endl;
system("pause");
#endif
cout << "Intentando verificar cantidad de dispositivos\nVID: 0925\nPID: 1231" << endl;
int tmp = USB_GetDeviceCount(VID_PID);
cout << "Cantidad de dispositivos: " << tmp << "\n" << endl;
system("pause");
#ifdef VER-ERR
cout << "Verificando ultimo error..." << endl;
err = GetLastError();
if(err != NULL)
ErrorHandler(err);
else
cout << "No hay errores.\n" << endl;
#endif
cout << "Intentando abrir el dispositivo..." << endl;
AbrirPipes();
//*********FINALIZAR************
system("pause");
cout << "Liberando DLL..." << endl;
::FreeLibrary(hDLL);
ErrorHandler(GetLastError());
system("pause");
return 0;
}
void ConvertirVersion(DWORD VerGET, BYTE* VerPARSE){
memset(VerPARSE, 0, 4);
VerPARSE[1] = static_cast<BYTE>(VerGET >> 24);
VerPARSE[0] = static_cast<BYTE>(VerGET >> 16);
VerPARSE[3] = static_cast<BYTE>(VerGET >> 8);
VerPARSE[2] = static_cast<BYTE>(VerGET);
}
void AbrirPipes(void){
hUSB_DeviceOut = USB_Open(0, VID_PID, out_pipe, 0, 0);
hUSB_DeviceInp = USB_Open(0, VID_PID, inp_pipe, 1, 0);
if(hUSB_DeviceOut == INVALID_HANDLE_VALUE || hUSB_DeviceOut == INVALID_HANDLE_VALUE)
cout << "Error al iniciar la conexion\n" << endl;
}
void CerrarPipes(void){
USB_Close(hUSB_DeviceOut);
USB_Close(hUSB_DeviceInp);
}
bool ErrorHandler(DWORD dwCodigo){
switch(dwCodigo){
case 0:
cout << "Exito" << endl;
cout << endl;
return true;
break;
case 5:
cout << "Acceso denegado. (Error 5)" << endl;
break;
case 8:
cout << "El sistema no tiene memoria suficiente para realizar la tarea. (Error 8)" << endl;
break;
case 126:
cout << "No se ha encontrado la libreria especificada. (Error 126)" << endl;
break;
case 127:
cout << "No se ha encontrado el procedimiento en la libreria DLL.\nVerifique que la version de la libreria sea la correcta y\nque esta se encuentre en el directorio de la aplicacion. (Error 127)" << endl;
break;
case 182:
cout << "Esta aplicacion no admite esta version de Windows. Actualize su sistema operativo." << endl;
break;
case (-1):
cout << "Error desconocido. Codigo: -1." << endl;
break;
default:
cout << "Error desconocido. Codigo: 0x" << hex << uppercase << dwCodigo << endl;
break;
}
cout << endl;
system("pause");
exit((-1));
}
Aviso que cualquiera puede usar este código, sin restricción alguna, pero haciendo que funcione, jaja.
Bueno, espero, puedan ayudarme.