技术宅的结界

 找回密码
 立即注册→加入我们

QQ登录

只需一步,快速开始

搜索
热搜: 下载 VB C 实现 编写
查看: 293|回复: 5
收起左侧

【VB.NET】从无到有:VB.NET版的GLEW库(不依赖glew的Dll或Lib)

[复制链接]

1069

主题

2476

帖子

6万

积分

用户组: 管理员

一只技术宅

UID
1
精华
223
威望
420 点
宅币
20083 个
贡献
41601 次
宅之契约
0 份
在线时间
1892 小时
注册时间
2014-1-26
发表于 2020-10-3 06:41:34 | 显示全部楼层 |阅读模式

欢迎访问技术宅的结界,请注册或者登录吧。

您需要 登录 才可以下载或查看,没有帐号?立即注册→加入我们

x
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看里面的内容,看看有没有什么规律。

tgt.png

好!很有规律。事实上,GLEW的源码是用python生成的。我于是编写VB6代码对这些头文件进行了一些粗暴的“语法分析”,或者说是特征分析。

somefunc.png
somelooklike.png
some2.png
isapi.png
isfp.png
com.png

这些代码,足够从glew.h和wglew.h里面分析其C语法和宏了(分析GLU.h的时候会因为API声明不是单一行所以懒得弄),把其中我需要的内容比如参数、函数指针声明、API、常量定义等都抓出来

就像下图这样。

parse.png

写完一个这样的读取器以后,我休息了三天。因为我一时半会儿没想到怎么把已经分析好了的内容输出为VB.NET。

于是为了增加视觉效果从而提高灵感,我先把界面完善了。

vb6gl.png

可以从TreeView看到,我的解析没有大的问题,顶多就是一些结构体或者类型定义需要手动处理。所以我先把这些东西汇总,然后针对性编写其替换方式。

td.png

也就这么多。不如直接手写类型的转换。

typedef.png

param.png

对于不认识的类型我让它打个Debug.Print就可以看了。凡是指针类型的,难办的都换成IntPtr,比如wchar_t*字符串的数组,不能用UnmanagedType.LPWStr来提示其wchar_t本质,毕竟是数组,此时就只能IntPtr。需要注意的一点是Marshal叫你用IntPtr当指针,而不是UIntPtr,否则会提示你类型不能互转。(可Marshal竟然允许你用Integer当指针,即使不兼容x64,.NET的指针是有符号的么)

处理完类型以后,我把所有的函数指针、托管函数、初始化函数都写好以后,基本上就可以试用了。

vb6vbnet.png

InitCode.png

不愧是我。在VB6里写VB.NET,哈哈哈哈哈哈

然后我生成代码,试运行。暂时没有发现任何问题。

36k.png

40k.png

看着四万多行自动生成的代码,VS2019都卡得不行,不管是写代码还是拖动滚动条都卡。但,编译并不慢,它的代码高亮自动提示等IDE功能等一会儿就能反应过来,并且正常使用。

vbnetglew.png

那就目前而言,OK了。请从GitHub下载最新的源码。

GLEW_Translation源码:
https://github.com/MickeyMeowMeowHouse/GLEW_Translation

评分

参与人数 1威望 +10 宅币 +30 贡献 +10 收起 理由
watermelon + 10 + 30 + 10 赞!

查看全部评分

回复

使用道具 举报

27

主题

293

帖子

1691

积分

用户组: 上·技术宅

UID
3808
精华
9
威望
98 点
宅币
1002 个
贡献
155 次
宅之契约
0 份
在线时间
304 小时
注册时间
2018-5-6
发表于 2020-10-3 14:52:06 | 显示全部楼层
厉害了,图形学的确可以弄得很酷绚,并且让计算机称之为“计算机”;
用代码生成代码可以说很赛博朋克了。

点评

视角独特性: 5.0
视角独特性: 5
  发表于 2020-10-5 07:35

36

主题

168

帖子

7420

积分

用户组: 管理员

UID
77
精华
11
威望
126 点
宅币
6802 个
贡献
143 次
宅之契约
0 份
在线时间
124 小时
注册时间
2014-2-22
发表于 2020-10-3 16:31:11 | 显示全部楼层
用VB的A5才是我认识的A5。

1069

主题

2476

帖子

6万

积分

用户组: 管理员

一只技术宅

UID
1
精华
223
威望
420 点
宅币
20083 个
贡献
41601 次
宅之契约
0 份
在线时间
1892 小时
注册时间
2014-1-26
 楼主| 发表于 2020-10-4 03:27:56 | 显示全部楼层
美俪女神 发表于 2020-10-3 16:31
用VB的A5才是我认识的A5。

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

4

主题

16

帖子

265

积分

用户组: 中·技术宅

UID
5148
精华
1
威望
14 点
宅币
191 个
贡献
25 次
宅之契约
0 份
在线时间
11 小时
注册时间
2019-7-17
发表于 2020-10-4 11:16:28 | 显示全部楼层
A5姐姐好棒呀!!!!

本版积分规则

QQ|申请友链||Archiver|手机版|小黑屋|技术宅的结界 ( 滇ICP备16008837号 )|网站地图  

GMT+8, 2020-10-28 11:28 , Processed in 0.111374 second(s), 38 queries , Gzip On.

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表