11
Jan
January 11, 2013 分类: ASM/C/C++     作者: hoverlees     留言: 发表

Go语言十分简单,跨平台,非常适用于网络应用的开发,本人相当看好。不过很多时候,还是需要扩展Go让Go实现更多的功能,如操作底层硬件、创建窗口等,这个要求可以通过调用C的方式实现。

本文以windows下的Go开发为例,linux完全一样。当然,Windows上首先要安装MinGW.

http://www.hoverlees.com/blog/?p=1465

先做一个GO显示一个对话框窗口的简单示例。在go目录src/pkg下新建一个文件夹名为hover,新建一个hover.go文件,内容如下

package hover
//#include <windows.h>
import "C"
func Msgbox(title string,body string) int{
	C.MessageBox(nil,(*C.CHAR)(C.CString(body)),(*C.CHAR)(C.CString
(title)),0);
	return 0;
}

与其说这是一个go源码文件,还不如把它理解成C语言的模板文件,cgo编译时,会把这个文件的内容转换成C程序并使用gcc编译,所以本人强列推荐将这个程序当成C程序阅读。程序中第二行的注释会在转换成C语言时做为C的代码。Msgbox会调用Windows系统函数MessageBox,并传入对应参数。由于go的数据类型与C语言的数据类型在内存中的表示不同,所以需要转换。Go与C的数据类型对有对应的转换方式,具体可以参看文档。因为MessageBox的第二第三个参数是LPSTR(unsigned char*),所以在调用时需要将Go的string转换成LPSTR类型。

接下来编译和安装函数包:

go build hover
go install hover

编译完成后,可以在程序中import这个hover库。下面写一个简单的程序调用刚刚写好的函数

package main
import "hover"
func main(){
	hover.Msgbox("title","body");
}

最终生成的程序会弹出一个对话框,标题和内容都按程序指定的显示。


查看详细内容 »

标签: ,
18
Jan
January 18, 2012 分类: Interesting     作者: hoverlees     留言: 1

我想很多使用C#的朋友,没有想过它为什么要叫C sharp吧。我不使用C#,而且一直故意会读它“C井”,很多用C#的朋友都会向我纠正,说它读C sharp,但我反问他们为什么叫C sharp的时候,他们又不知道,或者想都没想过。

当然啦,我这也是无聊,说说我的想法。回想C++名字的来源,首先,它是C的升级,而且当初使用了C的运算符号++,表示它是C的提升,那么C#呢,有很意思的是,C在音乐中,表示我们的“哆”音,例如频率261.6HZ的中央C。#号在音乐中表示升调,Sharp就是尖锐的意思嘛,所以C#就是C的升调,跟C++的起名有异曲同工之效。

标签: ,
24
Oct
October 24, 2011 分类: ASM/C/C++, PHP/MySQL     作者: hoverlees     留言: 5

最近有打算给博客做个统计插件,看看都是哪儿来的朋友在看我的博客儿,需要一个详细的IP地址归属地数据库。网上找了个纯真的MySQL版的,30多万条数据占了20M左右的数据库空间,觉得有点浪费数据库空间,而且数据库查询时间太慢,特别是要一次性查多个结果时,更是不得了.最主要的是这种应用场合不适合做成数据库形式的。

所以就准备自己做数据库了,自己也有50000亿条数据的数据文件的设计经验。这才30多万条没什么问题。。。按自己的想法生成了文件,并写了PHP和C语言的访问API,心情好的时候再补写上Java啊,汇编啊什么的API也是挺好的。

数据库下载:GBK版 UTF8版

PHP API(函数):这个是函数形式的PHP代码,博客版面上是写描述,具体代码在这里:ips.php ip_area.php

<?php
/**
 * IP地址归属地查询 PHP函数版
 * @author Hoverlees http://www.hoverlees.com me[at]hoverlees.com
 * @comment 此功能同时包含C/C++,PHP类,PHP函数,等版本提供下载。
 * 数据库文件及相关代码下载地址:http://www.hoverlees.com/blog/?p=906
 */

/*对象状态常量*/
define('IPV4_AREA_ERROR_SUCCESS',0); //正常
define('IPV4_AREA_ERROR_OPENFILE',-1); //无法打开文件
define('IPV4_AREA_ERROR_FORMAT',-2); //数据库格式不对

/**
 * IPv4地址转整数函数,注意本函数不检查IP地址的合法性
 * @param $ip IPv4地址
 * @return 转换后的整数
 */
function ipv4_atol($ip){}
/**
 * 创建IP表对象
 * @param $filename 数据库文件名
 * @param $index_read_parts 索引划分的块数,如果为1,表示索引全部读入内存(占用大约4M内存空间),如果为2则只需要占用4/2=2M内存临时空间。此值越大,需要的内存缓冲越少,但磁盘的IO次数增加。如果需要循环查询多个IP,建议此值设为1.如果只查询一次可以根据内存要求自行设定。
 * @return 用于查询的数据库对象,使用完成后请调用ipv4_area_free释放占用的资源
 */
function ipv4_area_create($filename,$index_read_parts=1){}
/**
 * IP址所在地查询
 * @param $obj 数据库对象
 * @param $ip IP地址,可以为'XXX.XXX.XXX.XXX'格式
 * @return 归属地名称
*/
function ipv4_area_search($obj,$ip){}
/**
 * 释放IP数据库
 * @param $object 由函数ipv4_area_create返回的表对象
 */
function ipv4_area_free($object){}
?>

代码调用示例:


查看详细内容 »

标签: , , ,
快速链接
推荐标签
最新图片
较新文章
随机推荐
友情链接