|
本帖最后由 ganlinlao 于 2017-2-25 19:21 编辑
剩下的30%,说实话,基本是跟语言无关,更多的是一些更基本的东西。
如下例子:
glew 2.0的VB6版本的DLL以及TLB制作过程
其中,glew32vb.dll是怎么制作的呢?
首先我发现VB6不能直接用glew32.dll是因为它用函数指针记录opengl特性函数的地址,导出dll时直接导出这个函数指针的符号,VB6是不能直接调用DLL里面的函数指针指向的函数的。这些函数都是由驱动提供,glew在Windows下都是通过调用wglGetProcAddress取得的,因此glew32.dll不能直接静态地导出这些函数的地址。
怎么办呢,我的做法是直接写个汇编的跳转表,自己导出这些函数的符号,当VB6调用我的汇编写的DLL导出的符号的时候,我一个jmp就能直接跳到函数指针指向的函数的入口处。这样我既有静态的导出函数的地址,又能帮VB跳到函数指针的位置。
OpenGL支持的函数很多,如果要手动写这个汇编的话,效率非常低。这肯定要自动化的,也不难,直接用exescope看glew32.dll的导出表,然后把它存储为txt,就能得到这些符号了。
exescope导出的txt非常整齐,直接用notepad++打开,Alt+左键,一个列编辑操作,直接就可以把左边两列没用的东西都删了,得到纯粹的符号表。
……
……
……
其中我在调试的过程中发现了用MIDL生成TLB的一些特性:
1、MIDL不支持函数指针。
2、所有的typedef都必须写在module的前面。
3、VB6不认char*, 各种**, 各种int, unsigned long, unsigned short, signed char等各种类型。
为了解决这些特性,我的这个工程具有以下功能:
1、两遍pass,把typedef和常量、函数分开。
2、避开重复定义,遇到重复定义的常量,直接注释掉。
3、遇到定义常量别名的情况:自动将第一次pass时记录的常量值展开。
4、遇到函数的参数列表里有函数指针时:强行换成void*
5、遇到char*时:强行换成LPSTR
另外我手动把那些和VB6无关的玩意儿,比如安卓的EGL、Unix的GLX等特性文件,都移到了别的文件夹。
****************************
这就是关于30%的部分。
坦白地说,要看懂上面的所有内容是极其不容易的。 |
本帖子中包含更多资源
您需要 登录 才可以下载或查看,没有帐号?注册
x
|