跳至主要内容

VB和Dev-C++合作

VB和Dev-C++合作——手把手教你写GUI程序

redraiment, 2009-08-13

声明





  此文的读者定为C语言初学者。此文介绍的技巧适用于开发迷你型项目或自娱自乐的玩具程序,正规的项目中可能不会采用。读者可以抱着茶余饭后休闲娱乐的心态来围观,至于CLI、GUI等名词解释请参看百度百科。转载请保留此声明和原作者redraiment,谢谢!

诱人的GUI程序

  程序的作用就是化繁为简,让计算机高效地帮我们完成枯燥的工作。写程序最大的动力就是你精心设计的程序能获得大家的认可、大众的好评,这其中伴随着发布程序给大家使用。
  在C语言编写的操作系统(比如UNIX、Windows等)上,C语言可以说是“无所不能”。但很多初学者发现,即便自己把C语言教材从头啃到尾,依然只能写出命令行下的程序。程序是CLI还是GUI本无可厚非,对我们程序员来说更重要的是程序本身提供的功能嘛,而且CLI相对于GUI还更灵活一些。也许你可以尝试一下把程序发送给一个非计算机科班出身的朋友,估计得大费唇舌来解释程序如何运行,可能最后还落得一个“不方便”的抱怨。撇开这些不说,至少一个活泼的桌面图标也比死气沉沉的终端图标更吸引人。
  但编写GUI程序从来不是一件容易的事情,MFC也好、Swing也罢,都是一堆烦人的接口。用VB可以屏蔽这些细节,界面设计是所见即所得的,拖拖拽拽就能堆出一个像样的界面。本文的原理就是用VB来设计前台界面,C做后台逻辑处理。实现方法就是将C程序打包成DLL文件,由VB程序来调用。

所需软件

  Dev-C++ 4.9.9.2或以上版本,VB 6.0精简版。这两款软件在华军软件园都能下载到,合起来大小也就15MB左右。如果你有完整版的VB当然更好,不过有精简版的也够用了。

Dev-C++生成DLL的方法

  1. 打开Dev-C++;
  2. 点击“文件”-“新建”-“工程”,工程类型选择“DLL”;
  3. 语言必须选择“C”,不能选择“C++”;
  4. 为工程取一个名字,比如“hello”。确定后会自动生成“dllmain.c”和“dll.h”两个文件;
  5. “dllmain.c”里自带了一个函数“DLLIMPORT void HelloWord ()”,但为了能在VB里调用,需要在DLLIMPORT后面添加一个“__stdcall”,即“DLLIMPORT __stdcall void HelloWord ()”,“dll.h”文件中也做同样的修改。没有写“__stdcall”的话会弹出“DLL调用约定错误,错误号:49”,所以请务必小心。
  6. 保存文件后,按Ctrl+F9编译。就会在工程的目录下生成一个hello.dll。

用VB设计程序界面

  1. 打开VB;
  2. 新建一个“标准EXE”工程;
  3. 拖一个按钮控件(工具箱的第三行第二列)到界面上,如下图。

在VB中调用DLL里的函数

  在VB中调用DLL里的函数,首先要声明。声明的格式是
[Public|Private] Declare [Sub|Function] 函数名 Lib "DLL路径,可以是相对路径,也可以是绝对路径" (ByVal或ByRef等参数列表) [as 返回值类型]
  比如我们这里函数声明为:
Private Declare Sub HelloWorld Lib "dll.dll" ()
  声明后就可以调用了。
  1. 双击VB的窗口界面,打开代码窗口;
  2. 将一下代码复制到代码窗口里
    Private Declare Sub HelloWorld Lib "hello.dll" ()

    Private Sub Command1_Click()

        HelloWorld

    End Sub
  3. 点击“文件”-“生成工程1.exe”,路径选择刚才Dev-C++生成hello.dll所在的目录。
  4. 确保“工程1.exe”和“hello.dll”两个文件放在同一个目录下,双击运行“工程1.exe”。
  5. 点击按钮“Command1”,就会弹出一个窗口,显示“Hello World from DLL!”则表示调用DLL成功!如下图
  现在,你可以自由发挥来编写丰富多彩的GUI程序了!

附录A:C参数在VB中的声明

C语言的字符串要特殊处理
char *: ByVal args As String

short -> Integer
int -> Long
long -> Long
UNIT -> Long
ULONG -> Long
WORD,DWORD -> Long
WPARAM,LPARAM -> Long
WMSG,UMSG -> Long
HRESULT -> Long
BOOL -> Boolean
COLORREF -> Long
HWND,HDC,HBRUSH,HKEY,等等. -> Long
LPSTR,LPCSTR -> String
LPWSTR,OLECHAR,BSTR -> String
LPTSTR -> String
VARIANT_BOOL -> Boolean
unsignedchar -> Byte
BYTE -> Byte
VARIANT -> Variant
(任何以*或**结尾的数据类型)Long

评论

此博客中的热门博文

DAO层测试

<dependency> <groupId>com.wix</groupId> <artifactId>wix-embedded-mysql</artifactId> <version>2.1.4</version> <scope>test</scope> </dependency> 利用 wix-embedded-mysql 把MySQL嵌入到进程中,作为内存型的MySQL来做单元测试。 脚本: resources/migrations/mysql/<database>/<timestamp>_<action>.sql 但多个项目需要共享数据库脚本,可能可以用 git submodule 共享。

JavaScript中的字符串乘法

JavaScript中的字符串乘法 redraiment, Date 原文 原文地址: http://www.davidflanagan.com/2009/08/string-multipli.html 原作者:David Flanagan In Ruby, the "*" operator used with a string on the left and a number on the right does string repetition. "Ruby"*2 evaluates to "RubyRuby", for example. This is only occasionally useful (when creating lines of hyphens for ASCII tables, for example) but it seems kind of neat. And it sure beats having to write a loop and concatenate n copies of a string one at a time--that just seems really inefficient. I just realized that there is a clever way to implement string multiplication in JavaScript: String.prototype.times = function(n) {     return Array.prototype.join.call({length:n+1}, this); }; "js".times(5) // => "jsjsjsjsjs" This method takes advantage of the behavior of the  Array.join()  method for arrays that have undefined elements. But it doesn't even bother creating an array with n+1 undefined ele...

人所不欲,勿施于人

谁说博客也要像论文一样结构清晰、有条理?! 软件卸载 昨天整理自己的本本,卸载了 VMware 7.0 + 深度XP,MS Office 2007 以及 Visual Basic 6.0。我承认这些都是盗版软件,不过剩下的应用程序都是自由软件(freeware)或免费软件(freeware),这下我的计算机“干净”了。闲来无事,我就细数了一下当初装这些软件的原因: VMware + XP:当初刚买本本的时候,正好在上软件工程实践,紧遵老师的教导“将自己的开发环境随身携带”,自然第一款软件就是装了虚拟机(学校机房里是肆无忌惮地用盗版 VMware),另外上课指定使用 Visio 作图,那也只好一起装了;当然,也有部分原因是因为某些人的计算机装的是 XP,我这边有个 XP 环境也是为了方便问题重现(我的本本预装了 Vista)。 MS Office 2007:在毕设期间,我也还是用 Open Office 和 WPS 2010,但现在公司用的却是 Office 2007(正版)。我这次卸载这款办公软件其实也是在提醒自己:工作的事情要在工作时间里完成! VB 6:你可能无法想象在我们科班的毕业设计中有多少是 VB6 项目,从大二开始,每逢毕业将至,总会有人来找我帮忙看那些不晓得从哪儿搜罗来的 VB6 代码,经不住软磨硬泡,我总会帮着改改;另一个原因在我自己,我一直下不了决心去学 MFC 等,所以但凡要做 GUI 程序,我都是拿 VB6 来画界面,再调用由 C 语言开发的 DLL 库,不过现在改用 QT,于是 VB6 可以功成身退了。 己所不欲,勿施于人 有些人就喜欢把自己的事全盘交托给别人来做,我一直不明白他们既然有精力去说服别人,为什么就没耐心自己去完成(所以我下面说人和人之间是无法理解的)。既然自己都认为这是无聊的事情,为什么偏偏又假设其他人会愿意无偿地帮你来完成呢? 两千多年前,孔老夫子提出“己所不欲,勿施于人”的观点,但到了今天,我听到关于这句话时的语境普遍是,A说:“那个XX东西你也不要了(或要了也没用),不如就让给我吧?”,B就义正言辞地反对:“那怎么可以!己所不欲,勿施于人嘛。” 己所甚欲,勿施于人 易中天老师在《百家讲坛》讲解诸子百家...