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.