在VBA中直接使用Cypress的.NET版CyUSB.dll存在兼容性问题,但可以通过以下方案实现:
CyUSB.sys识别)(适合有C#基础的用户)
创建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);
}
}注册COM组件
MyComWrapper.dllregasm MyComWrapper.dll /tlb:MyComWrapper.tlb
gacutil /i MyComWrapper.dll在VBA中引用
工具 > 引用 勾选 MyComWrapper 1.0 Type LibrarySub Test()
Dim wrapper As MyComWrapper
Set wrapper = New MyComWrapper
If wrapper.OpenDevice() Then
wrapper.SendData ByteArrayFromVBA()
End If
End Sub(适合需要高性能的场景)
创建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);
}实现函数(需调用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);
}在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 SubByte数组与C#/C++需严格对齐try-catch,C++用__try/__except)IDisposable或在C++中提供CloseDevice函数如果以上方法复杂度较高,可考虑:
VB.NET开发Excel插件(VSTO),直接引用CyUSB.dll.NET DLL(使用pythonnet库),再与VBA交互建议优先尝试方法一,并参考Cypress官方示例代码(如CyUSBC#CyUSBTest)进行适配。
举报
更多回帖