0xAA55 发表于 2020-10-3 06:41:34

【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

watermelon 发表于 2020-10-3 14:52:06

厉害了,图形学的确可以弄得很酷绚,并且让计算机称之为“计算机”;
用代码生成代码可以说很赛博朋克了。

Golden Blonde 发表于 2020-10-3 16:31:11

用VB的A5才是我认识的A5。

0xAA55 发表于 2020-10-4 03:27:56

美俪女神 发表于 2020-10-3 16:31
用VB的A5才是我认识的A5。

有Marshal的VB.NET才是我认可的VB

陈布衣 发表于 2020-10-4 11:16:28

A5姐姐好棒呀!!!!

haha2020 发表于 2022-3-10 12:47:41

谢谢分享
页: [1]
查看完整版本: 【VB.NET】从无到有:VB.NET版的GLEW库(不依赖glew的Dll或Lib)