int CANDriver::initialize()
{
    CHAR errorBuffer[VCI_MAX_ERRSTRLEN];
    HRESULT vciResult;

    if ( (vciResult = vciInitialize()) != VCI_OK )
    {
        vciFormatError(vciResult, &errorBuffer[0], sizeof(errorBuffer));
        emit errorOccured(errorBuffer);
        return 1;
    }

    HANDLE hEnum;
    if ( (vciResult = vciEnumDeviceOpen(&hEnum)) != VCI_OK )
    {
        vciFormatError(vciResult, &errorBuffer[0], sizeof(errorBuffer));
        emit errorOccured(errorBuffer);
        return 1;
    }
    vciEnum_ptr phEnum(&hEnum, vciEnumDeviceClose);

    VCIDEVICEINFO deviceInfo;
    if ( (vciResult = vciEnumDeviceNext(hEnum, &deviceInfo)) != VCI_OK )
    {
        vciFormatError(vciResult, &errorBuffer[0], sizeof(errorBuffer));
        emit errorOccured(errorBuffer);
        return 1;
    }

    HANDLE hDevice;
    if ( (vciResult = vciDeviceOpen(deviceInfo.VciObjectId, &hDevice)) != VCI_OK )
    {
        vciFormatError(vciResult, &errorBuffer[0], sizeof(errorBuffer));
        emit errorOccured(errorBuffer);
        return 1;
    }
    vciDevice_ptr phDevice(&hDevice, vciDeviceClose);

    return 0;
}
void CSocketSelectDlg::DeviceListUpdate( )
{
  LRESULT       lCount;
  LRESULT       lData;
  VCIDEVICEINFO sInfo;

  //
  // remove all unavailable devices from the device list
  //
  lCount = SendItemMessage(IDC_DEVLIST, LB_GETCOUNT, 0, 0);

  for (LRESULT lIndex = 0; lIndex < lCount; lIndex++)
  {
    lData = SendItemMessage(IDC_DEVLIST, LB_GETITEMDATA, lIndex, 0);
    if ((lData != LB_ERR) &&
        (vciDeviceGetInfo((HANDLE) lData, &sInfo) != VCI_OK))
    {
      vciDeviceClose((HANDLE) lData);
      SendItemMessage(IDC_DEVLIST, LB_DELETESTRING, lIndex, 0);
    }
  }

  //
  // The selection may change because the currently selected
  // item is deleted.
  //
  DeviceListSelect();

  //
  // enumerate all devices
  //
  if (m_hDevEnu != NULL)
  {
    vciEnumDeviceReset(m_hDevEnu);
    while (vciEnumDeviceNext(m_hDevEnu, &sInfo) == VCI_OK)
      DeviceListInsert(sInfo.VciObjectId);
  }
}