OCX控件是如何导出方法的?

大狗狗 2017-11-29 09:36:50
手头有一个DSOFrame控件源码,在里头加了个函数,声明为public,编译成功后用AxImp.exe导出一个.NET DLL,C#项目中引用,发现我加的那个方法显示不出来。不仅如此,其它不少原有的public的方法都没能显示出来。看来我原先想的只要声明为public就能导出是错了,我猜是不是C++代码中有什么声明符号来规定某一函数导出对外可见,搜了整个文档,没找到传说中的dllexport,仅仅发现一个def文件,里面内容:
LIBRARY    dsoframer.ocx
EXPORTS
DllGetClassObject PRIVATE
DllCanUnloadNow PRIVATE
DllRegisterServer PRIVATE
DllUnregisterServer PRIVATE

请教下高手:是什么因素决定了控件里的方法对外可见?
...全文
461 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
大狗狗 2017-12-01
  • 打赏
  • 举报
回复
感谢大家回复,这个dsoframer工程真是很古老了,VC6下的东西。经过研究,它是用一个odl文件来定义了类型库,然后根据该odl生成olb文件,这个olb文件貌似是当作资源被嵌入进ocx中,这样系统就知道ocx要导出些什么东西了。大概思路如此。麻烦之处在于现在的VS环境和当初真是差别很大,我好不容易用VS2010编译成功了这个工程,但却不知道如何把odl生成olb。最后采取了一个笨办法:在VM上安装了windows xp虚拟机,xp里再安装了VC6,用VC6打开我修改过的odl(我添加了两个输出函数),选择编译这个odl文件,VC6就生成了对应的olb和.h文件。大功告成。
大狗狗 2017-12-01
  • 打赏
  • 举报
回复
引用 4 楼 u012072837 的回复:
ocx添加接口不止是添加一个public就行,在ClassView类视图中添加后,会对整个工程几个部分的内容一起添加的
切换到类视图后,我在接口中添加了方法,然后发现odl内容被编译器改更了。接着又在对应类中添加了具体的实现方法,编译器又更改了.h文件和cpp文件。到此为止代码已全部更改完毕,编译项目,olb文件未被更改,生成的ocx还是未能输出我新增的方法。
Saleayas 2017-11-30
  • 打赏
  • 举报
回复
C# 导出的这种 DLL 是从类型库中导出的。 也就是说其实不需要 .dll 文件也是可以的,使用 .idl 文件就可以导出,生成的 .NET DLL 文件仅仅是在编译的时候使用的。 所以你需要修改的 C++ 工程中的 .idl 文件,在这个文件中添加接口或者在修改某个接口。这样才能在 .NET 中看到。 你可以看到导出的很多方法都是接口的方法。而 .dll 导出的四个函数在 .NET 中是看不到的。这四个函数是给系统的。
赵4老师 2017-11-30
  • 打赏
  • 举报
回复
《COM本质论》?
真相重于对错 2017-11-30
  • 打赏
  • 举报
回复
建议了解一下什么是com? 导出方法不是简单的在类里面添加Public就可以了 因为ocx就是com,而com是基于接口的技术, 所以,你要修改它的Idl文件,和接口定义,再加上实现的类。
Dobzhansky 2017-11-30
  • 打赏
  • 举报
回复
是通过类型库导出的
l357630798 2017-11-30
  • 打赏
  • 举报
回复
引用 1 楼 CharlesSimonyi 的回复:
OCX实际上是个ActiveX控件,你需要了解C++开发ActiveX控件的基础知识。 不清楚你的源码是使用MFC还是用ATL来开发的,较为主流的是ATL,如果是的话可以在网上找一本《ATL开发指南》读一下
l357630798 2017-11-30
  • 打赏
  • 举报
回复
要使用CreateInstance来创建组件对象,然后查询其接口并转换才能使用对应接口的方法,一般.idl文件提供之后就可以编译生成.h文件,你就可以看到方法了。 或是使用OleView也是可以看到的。
moonk-z 2017-11-30
  • 打赏
  • 举报
回复
ocx添加接口不止是添加一个public就行,在ClassView类视图中添加后,会对整个工程几个部分的内容一起添加的
zgl7903 2017-11-30
  • 打赏
  • 举报
回复
在类视图中,使用向导添加方法和属性
boylafong 2017-11-30
  • 打赏
  • 举报
回复
一般来说,在左边你的类上面选择添加函数就可以了
encoderlee 版主 2017-11-30
  • 打赏
  • 举报
回复
OCX实际上是个ActiveX控件,你需要了解C++开发ActiveX控件的基础知识。 不清楚你的源码是使用MFC还是用ATL来开发的,较为主流的是ATL,如果是的话可以在网上找一本《ATL开发指南》读一下

16,472

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧