以文本方式查看主题

-  金字塔客服中心 - 专业程序化交易软件提供商  (http://www.weistock.com/bbs/index.asp)
--  高级功能研发区  (http://www.weistock.com/bbs/list.asp?boardid=5)
----  [求助]用demo制作DLL,VBA调用结果不对  (http://www.weistock.com/bbs/dispbbs.asp?boardid=5&id=167579)

--  作者:thsimong
--  发布时间:2019/1/8 22:20:33
--  [求助]用demo制作DLL,VBA调用结果不对
1.在MyActiveXdemo中,改写mytest函数,如下:
int  VBSAddin::MyTest(int kaidan1, int kaidan2,int kaidan3)
{
kaidan1 = kaidan1 + 100;
kaidan2 = kaidan2 + 100;
kaidan3 = kaidan3 + 100;
return 100;
}
并在def模块中添加 EXPORT mytest @1,
其他均承袭demo,未作修改
2. 在VBA中调用方式如下:
Dim MyAddin 

Set MyAddin = CreateObject("DynamicWrapper")
 
MyAddin.Register"MyActiveXDemo.DLL","MyTest","i=ttt","f=s","r=t"
   
fanhui= MyAddin.MyTest(kaiduodan1,kaiduodan2,kaiduodan3)

3.打印结果
变量初始值均为1,运行后,fanhui为空,其余三个参数均未改变,都为1。确定的是函数有被调用运行,确定方法是在test中添加AfxMessageBox函数,能正确弹出窗口。

4.疑惑问题
理论上调用函数后,各个参数的值应该分别为100,101,101,101才对啊。那么,问题出在哪呢?

斑竹或路过大神帮帮忙啊,好焦虑,好捉急。这个问题卡了好几天了。。。

跪谢。。。

--  作者:无为剑
--  发布时间:2019/1/9 11:14:44
--  
1,C语言的参数是以复制方式传递的,你这么使用只能是当向的,不可能被修改后返回。若你希望参数在函数中修改,那么你需要将参数修改成指针,类似 int  VBSAddin::MyTest(int * kaidan1, int * kaidan2,int * kaidan3)。这么定义的参数在VBA中调用是很麻烦的,一般我们是通过VARIANT*类型来解决的,也就是你的参数要改成  MyTest(VARIANT* kaidan1, VARIANT* kaidan2,VARIANT* kaidan3)  ,这样就可以在VBA中调用并可以返回被修改的变量。
--  作者:thsimong
--  发布时间:2019/1/9 11:25:30
--  
demo是用c++写的。可是,按您说的,我改成VARIANT* ,提示说语法不对啊。咋整?编译错误提示1002
--  作者:无为剑
--  发布时间:2019/1/9 18:06:11
--  
感觉您对C++的COM编写的能力还有待提高,您可以网上继续学习相关的资料,对于C++的客服工作,你目前的需求已经超过了我们的服务范围了
--  作者:thsimong
--  发布时间:2019/1/9 22:06:11
--  
无关c++问题。是按你说的,vba中改写成MyTest(VARIANT* kaidan1, VARIANT* kaidan2,VARIANT* kaidan3)  ,提示有语法错误