ExcelHome技术论坛

 找回密码
 免费注册

QQ登录

只需一步,快速开始

快捷登录

搜索
EH技术汇-专业的职场技能充电站 妙哉!函数段子手趣味讲函数 Excel服务器-会Excel,做管理系统 效率神器,一键搞定繁琐工作
HR薪酬管理数字化实战 Excel 2021函数公式学习大典 Excel数据透视表实战秘技 打造核心竞争力的职场宝典
让更多数据处理,一键完成 数据工作者的案头书 免费直播课集锦 ExcelHome出品 - VBA代码宝免费下载
用ChatGPT与VBA一键搞定Excel WPS表格从入门到精通 Excel VBA经典代码实践指南
查看: 3526|回复: 4

64位 VBA调用C++DLL,回调函数参数传递错误,请教各位达人

[复制链接]

TA的精华主题

TA的得分主题

发表于 2014-11-22 11:04 | 显示全部楼层 |阅读模式
我做了不少DLL,以前在VBA下调用都没问题,
最近做个东西,需要在DLL里面回调Excel VBA(和Acad)的处理过程,
系统平台和Excel都是64位的,
----------------VS 2010 旗舰版  --------------------------
C++中回调函数的原型如下:
typedef int (__stdcall * CBDocInfo)(HzemDocInfo * DocInfo);

DLL 入口函数:
#ifdef HZMFC_EXPORTS
#define HZMFC_API __declspec(dllexport)
#else
#define HZMFC_API __declspec(dllimport)
#endif
...........

extern "C" HZMFC_API int __stdcall ProjectManage( CBDocInfo Collect, CBDocInfo Inspect, CBDocInfo Generate, CBDocInfo Update)   
{
............
}

.Def 输出
--------------Excel  2013 64位   ------------------------------------
声明:

    Declare PtrSafe Function ProjectManage Lib "HZMFC.dll" (ByVal Collect As LongPtr, ByVal Inspect As LongPtr, ByVal Generate As LongPtr, ByVal Update As LongPtr) As Long

回调函数:
Public Function Collect(ByRef DocInfo As HzemDocInfoB) As Long
    Dim Rt As Integer
    Rt = StringUToA("Collect 回调函数测试", DocInfo.m_Proj.Comment)
    Collect = 1
End Function

Public Function Inspect(ByRef DocInfo As HzemDocInfoB) As Long
    Dim Rt As Integer
    Rt = StringUToA("Inspect 回调函数测试", DocInfo.m_Proj.Comment)
    Inspect = 1
End Function

'生成数据表
Public Function Generate(ByRef DocInfo As HzemDocInfoB) As Long
..................................
..................................
End Function

Public Function Update(ByRef DocInfo As HzemDocInfoB) As Long
    Dim Rt As Integer
    Rt = StringUToA("Update 回调函数测试", DocInfo.m_Proj.Comment)
    Update = 1
End Function

VBA调用 DLL 语句:
Private Sub CProjectManage_Click()
...................
    Rt = ProjectManage(AddressOf Collect, AddressOf Inspect, AddressOf Generate, AddressOf Update)
...................
End Sub
----------------问题---------------------------------------
进去后无论咋弄,都是只有第一个参数正确,
然后排在后面的参数都不正确,
无论第一个排的是long double 还是自定义类型;
始终只有第一个参数正确
象这样的调用运行就很良好
extern "C" HZMFC_API int __stdcall TestCB( CBDocInfo MakeDoc )   

但 假若你 往里面加俩参数,排在后面的立马乱套;

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-11-22 11:12 | 显示全部楼层
[广告] VBA代码宝 - VBA编程加强工具 · VBA代码随查随用  · 内置多项VBA编程加强工具       ★ 免费下载 ★      ★使用手册
问题补充HzemDocInfo结构定义:
----------------VS 2010 ----------------------------------------
typedef struct {                                                /*        包含语言\单位制\等信息在内的Project结构,主要用于
                                                                                        dll与其它模块间的数据交换
                                                                                        置及大小不得随意更改,数据均存储标准SI单位制                */
    Project m_Proj;                                                /*0        项目信息结构                                                                        */
    ProUnit m_Unit;                                                /*1        装置信息结构                                                                        */
    Discipline m_Disc;                                                /*2        专业信息结构                                                                        */
    EquItem m_Item;                                                /*3        单体设备信息结构                                                                */
    HzemDoc m_Doc;                                                /*4        文档信息结构                                                                */
                                                                                /*5        包括项目号、设计阶段代码单元号在内的的项目文件号*/
    TCHAR ProjUnitId[MaxIdLchar+MaxIdSchar];/*Project doc No.*/               
                                                                                /*6        专业编号、单体号、文档号在内的的专业文件号        */
    TCHAR DiscDocId[MaxIdSchar*3];                /*        Discipline doc. No.        */

    TCHAR ProjPath[264];                                /*7        项目路径名        _MAX_PATH */


        int m_Langurage;                                        /*8 当前出入口语言语言                        0 English 1 简体中文*/               
        int m_Unitsys;                                                /*9 当前出入口单位制体系                1、2、3、4                        */

}HzemDocInfo; // 928U

const unsigned int HzemDocInfo_Size = sizeof(HzemDocInfo);//-〉928U

------------------------VBA 7.1 64位--------------------------------------

Type HzemDocInfoB                    ' 项目信息数据结构
        m_Proj As ProjectB                    ' 0 项目信息结构
        m_Unit As ProUnitB                    ' 1 装置信息结构
        m_Disc As DisciplineB                 ' 2 专业信息结构
        m_Item As EquItemB                    ' 3 单体设备信息结构
        m_Doc As HzemDocB                     ' 4 文档信息结构
        ProjUnitId(MaxProUnitchar - 1) As Byte ' 5 存储相对路径
        DiscDocId(MaxDiscDocchar - 1) As Byte ' 6 设计编制
        ProjPath(264 - 1) As Byte            ' 7 设计编制
        m_Langurage As Long                  ' 7 文档类型
        m_Unitsys As Long                    ' 9 文档归属
        'CB1 As LongPtr
        'CB2 As LongPtr
End Type

‘LenB(HzemDocInfoB)=928
---------------------------------------------------------------------------------
单独的数据传递均没问题

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-11-22 14:11 | 显示全部楼层
邪门了,发现如下怪现象:
//extern "C" HZMFC_API double __stdcall TestDocInfo( HzemDocInfo &DocInfo,double Q,CBDocInfo Generate)   <-----函数名起成TestDocInfo 传递进来的  Generate错误
extern "C" HZMFC_API double __stdcall Test_Doc_Info( HzemDocInfo &DocInfo,double Q,CBDocInfo Generate)  <-----函数名起成Test_Doc_Info 传递进来的  Generate正确,所有参数都正常
{
}

这是怎么回事?

TA的精华主题

TA的得分主题

 楼主| 发表于 2014-11-22 14:16 | 显示全部楼层
本帖最后由 lsdlyhz 于 2014-11-22 14:19 编辑

不知咋回事,参数传递的对错跟函数的名字竟然有关系 :
比如名字起成 TestInfo,第二个参数dooble Q传进来都不对;
函数名字改成TestDocInfo,第二个参数对,第三个不对;
改成Test_Doc_Info,竟然全对了,!!!!!!!!!!
晕死了,我凌乱了;
真毁三观呀,不应该这样呀;

哪位大侠给破解破解

TA的精华主题

TA的得分主题

发表于 2020-11-5 09:45 | 显示全部楼层
[广告] Excel易用宝 - 提升Excel的操作效率 · Excel / WPS表格插件       ★免费下载 ★       ★ 使用帮助
请问这个如果vba的function参数是string类型,例如Function Abc(field As string),这个函数要在c++中回调,c++的参数类型对应的是什么呢
您需要登录后才可以回帖 登录 | 免费注册

本版积分规则

手机版|关于我们|联系我们|ExcelHome

GMT+8, 2024-11-22 12:46 , Processed in 0.040646 second(s), 9 queries , Gzip On, MemCache On.

Powered by Discuz! X3.4

© 1999-2023 Wooffice Inc.

沪公网安备 31011702000001号 沪ICP备11019229号-2

本论坛言论纯属发表者个人意见,任何违反国家相关法律的言论,本站将协助国家相关部门追究发言者责任!     本站特聘法律顾问:李志群律师

快速回复 返回顶部 返回列表