【VB.NET】从无到有:VB.NET版的GLEW库(不依赖glew的Dll或Lib)
VB.NET其实在VS的NuGet上已经有OpenGL的库了,你可以让你的项目依赖它。但我觉得那玩意儿不如自己捏的来得快,毕竟我更习惯GLEW的用法。最初的思路是想按照上回给VB6实现GLEW库的方式,分析GLEW收录的所有扩展的信息,然后自己生成Declare Function之类的去依赖glew32.dll来完成。
然而当我仔细研究了最近的VB.NET的情况以后,我发现完全可以不用依赖glew32.dll。VB.NET可以使用Marshal操作非托管内存,借助Marshal可以实现类似于VB6的As Any那样的效果。在调用API的时候,使用Marshal操作非托管内存的指针,在VB.NET和C#中都可以轻松做到,这和我以前想的不一样——我以前刚接触VB.NET的时候发现不能用VarPtr,不能用As Any,气得我学了一些C++(模板int参数展开无限套娃之类的东西)。
此外,Marshal还可以实现函数指针和托管互转,供VB.NET调用函数指针或者提供回调函数地址。多年没碰.NET,现在发现自己有点落伍了。
不过我很快就对上回那个方法感到了无趣。一个是我之前的办法并不够灵活,在遇到结构体的时候比较懵(当时我直接给VB6设置As Any参数,懒得啰嗦),而那么多OpenGL扩展的描述文件,要想都兼容,会遇到很多麻烦,因为总有几个不那么规范的。尤其是有那么一两个文件每一行开头不是一个Tab而是四个空格。所有的“那么一两个文件”我都照顾过来的话,还不如手动写。另一个是,我之前的办法是取glew32.dll的导出表来着,并且生成针对它的调用函数指针的Wrapper汇编,但VB.NET不需要这种做法,可以直接使用Marshal来完成通过函数指针调用函数的功能。
我突然想到,glew.h不就是现成的、都处理好了的头文件嘛。我直接解析glew.h、wglew.h不就可以了嘛。
说干就干。于是我熟练地在Windows 10打开VB6,随手拖了一些控件(主要拖了个TreeView),并把GLEW 2.1.0的glew.h和wglew.h放到工程位置,打开glew.h看里面的内容,看看有没有什么规律。
好!很有规律。事实上,GLEW的源码是用python生成的。我于是编写VB6代码对这些头文件进行了一些粗暴的“语法分析”,或者说是特征分析。
这些代码,足够从glew.h和wglew.h里面分析其C语法和宏了(分析GLU.h的时候会因为API声明不是单一行所以懒得弄),把其中我需要的内容比如参数、函数指针声明、API、常量定义等都抓出来。
就像下图这样。
写完一个这样的读取器以后,我休息了三天。因为我一时半会儿没想到怎么把已经分析好了的内容输出为VB.NET。
于是为了增加视觉效果从而提高灵感,我先把界面完善了。
可以从TreeView看到,我的解析没有大的问题,顶多就是一些结构体或者类型定义需要手动处理。所以我先把这些东西汇总,然后针对性编写其替换方式。
也就这么多。不如直接手写类型的转换。
对于不认识的类型我让它打个Debug.Print就可以看了。凡是指针类型的,难办的都换成IntPtr,比如wchar_t*字符串的数组,不能用UnmanagedType.LPWStr来提示其wchar_t本质,毕竟是数组,此时就只能IntPtr。需要注意的一点是Marshal叫你用IntPtr当指针,而不是UIntPtr,否则会提示你类型不能互转。(可Marshal竟然允许你用Integer当指针,即使不兼容x64,.NET的指针是有符号的么)
处理完类型以后,我把所有的函数指针、托管函数、初始化函数都写好以后,基本上就可以试用了。
不愧是我。在VB6里写VB.NET,哈哈哈哈哈哈
然后我生成代码,试运行。暂时没有发现任何问题。
看着四万多行自动生成的代码,VS2019都卡得不行,不管是写代码还是拖动滚动条都卡。但,编译并不慢,它的代码高亮自动提示等IDE功能等一会儿就能反应过来,并且正常使用。
那就目前而言,OK了。请从GitHub下载最新的源码。
GLEW_Translation源码:
https://github.com/MickeyMeowMeowHouse/GLEW_Translation
厉害了,图形学的确可以弄得很酷绚,并且让计算机称之为“计算机”;
用代码生成代码可以说很赛博朋克了。 用VB的A5才是我认识的A5。 美俪女神 发表于 2020-10-3 16:31
用VB的A5才是我认识的A5。
有Marshal的VB.NET才是我认可的VB A5姐姐好棒呀!!!! 谢谢分享
页:
[1]