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才对啊。那么,问题出在哪呢?
斑竹或路过大神帮帮忙啊,好焦虑,好捉急。这个问题卡了好几天了。。。
跪谢。。。
1,C语言的参数是以复制方式传递的,你这么使用只能是当向的,不可能被修改后返回。若你希望参数在函数中修改,那么你需要将参数修改成指针,类似
int VBSAddin::MyTest(int * kaidan1, int * kaidan2,int * kaidan3)。这么定义的参数在VBA中调用是很麻烦的,一般我们是通过VARIANT*类型来解决的,也就是你的参数要改成 MyTest(VARIANT* kaidan1, VARIANT* kaidan2,VARIANT* kaidan3) ,这样就可以在VBA中调用并可以返回被修改的变量。
demo是用c++写的。可是,按您说的,我改成VARIANT* ,提示说语法不对啊。咋整?编译错误提示1002
感觉您对C++的COM编写的能力还有待提高,您可以网上继续学习相关的资料,对于C++的客服工作,你目前的需求已经超过了我们的服务范围了