USB论坛
直播中

李伟

8年用户 1629经验值
私信 关注
[问答]

如何在VBA(excel)上使用 CyUSB.dll?

我想在VBA环境中驱动CY7C68013A。
但是官方提供的CYUSB.dll是.NET.dll。
2.设置开发环境
想请教各位前辈有没有VBA用的CYUSB.dll。 谢谢!

回帖(1)

王萍

2025-5-26 18:20:13

在VBA中直接使用Cypress的.NET版CyUSB.dll存在兼容性问题,但可以通过以下方案实现:




解决方案分步指南


1. 确认开发环境



  • 安装Cypress官方驱动和SDK(确保设备能被CyUSB.sys识别)

  • 安装.NET Framework 4.x(用于支持COM互操作)

  • 安装Visual Studio(用于创建COM包装层)




2. 方法一:通过C#创建COM可见的包装类


(适合有C#基础的用户)




  1. 创建C#类库项目


    using System.Runtime.InteropServices;
    using CyUSB; // 引用CyUSB.dll

    [ComVisible(true)]
    [Guid("YOUR-GUID-HERE")] // 用Guid生成工具创建唯一GUID
    [InterfaceType(ComInterfaceType.InterfaceIsIDispatch)]
    public interface IMyComWrapper
    {
       bool OpenDevice();
       void SendData(byte[] data);
    }

    [ComVisible(true)]
    [Guid("ANOTHER-GUID-HERE")]
    [ClassInterface(ClassInterfaceType.None)]
    public class MyComWrapper : IMyComWrapper
    {
       private USBDevice _device;

       public bool OpenDevice()
       {
           _device = new USBDevice();
           return _device != null;
       }

       public void SendData(byte[] data)
       {
           if (_device != null)
               _device.BulkOutEndPt.XferData(ref data, data.Length);
       }
    }



  2. 注册COM组件



    • 编译项目生成MyComWrapper.dll

    • 以管理员权限运行CMD:
      regasm MyComWrapper.dll /tlb:MyComWrapper.tlb
      gacutil /i MyComWrapper.dll




  3. 在VBA中引用



    • Excel VBA中:工具 > 引用 勾选 MyComWrapper 1.0 Type Library

    • 示例代码:
      Sub Test()
      Dim wrapper As MyComWrapper
      Set wrapper = New MyComWrapper
      If wrapper.OpenDevice() Then
           wrapper.SendData ByteArrayFromVBA()
      End If
      End Sub






3. 方法二:通过C++编写非托管DLL包装


(适合需要高性能的场景)




  1. 创建C++ DLL项目


    // MyWrapper.h
    #ifdef MYWRAPPER_EXPORTS
    #define MYWRAPPER_API __declspec(dllexport)
    #else
    #define MYWRAPPER_API __declspec(dllimport)
    #endif

    extern "C" {
       MYWRAPPER_API bool __stdcall OpenDevice();
       MYWRAPPER_API void __stdcall SendData(BYTE* data, int length);
    }



  2. 实现函数(需调用CyUSB API)


    #include "MyWrapper.h"
    #include

    USBDevice* g_device = nullptr;

    MYWRAPPER_API bool __stdcall OpenDevice()
    {
       g_device = new USBDevice();
       return g_device != nullptr;
    }

    MYWRAPPER_API void __stdcall SendData(BYTE* data, int length)
    {
       if (g_device)
           g_device->BulkOutEndPt->XferData(data, length);
    }



  3. 在VBA中声明API


    Private Declare Function OpenDevice Lib "MyWrapper.dll" () As Boolean
    Private Declare Sub SendData Lib "MyWrapper.dll" (ByRef data As Byte, ByVal length As Long)

    Sub Test()
       If OpenDevice() Then
           Dim data() As Byte
           data = ... ' 准备数据
           SendData data(0), UBound(data) + 1
       End If
    End Sub





注意事项



  1. 权限问题:注册COM组件或安装驱动需管理员权限

  2. 数据类型匹配:VBA的Byte数组与C#/C++需严格对齐

  3. 错误处理:建议在包装层添加异常捕获(C#用try-catch,C++用__try/__except

  4. 资源释放:在COM类中实现IDisposable或在C++中提供CloseDevice函数




替代方案


如果以上方法复杂度较高,可考虑:



  1. 使用VB.NET开发Excel插件(VSTO),直接引用CyUSB.dll

  2. 通过Python脚本调用.NET DLL(使用pythonnet库),再与VBA交互


建议优先尝试方法一,并参考Cypress官方示例代码(如CyUSBC#CyUSBTest)进行适配。

举报

更多回帖

发帖
×
20
完善资料,
赚取积分