文章关键字 ‘C语言’

C语言调用API获取程序自身的路径

2010年10月14日,星期四

VBS获取程序自身的路径很简单

WScript.Echo WScript.ScriptFullName

C语言其实也也很简单,只可惜以前太菜

TCHAR szFileName[MAX_PATH];
GetModuleFileName(NULL, szFileName, MAX_PATH);
MessageBox(NULL, szFileName, TEXT(""), 0);

参考链接:GetModuleFileName Function

GUI程序获取命令行参数

2010年10月13日,星期三

在Console程序中可以用main函数中的argc和argv遍历命令行参数。

#include <stdio.h>

int main(int argc, char *argv[])
{
    int i;
    for(i = 0;i < argc;i++)
        printf("%s\n", argv[i]);
    return 0;
}

那么在GUI程序中怎么遍历命令行参数呢?虽然WinMain函数的lpCmdLine参数中传入了程序的命令行参数,但是该参数不包含应用程序名(即main函数中的argv[0]),而且自己解析出每个参数也比较麻烦。

最简单的方法是先用GetCommandLineW函数获取命令行,然后用CommandLineToArgvW函数将命令行转化成C语言main函数argc和argv的形式。

#include <windows.h>
#include <stdio.h>
#include <shellapi.h>

int WINAPI WinMain(HINSTANCE hInstance, 
            HINSTANCE hPrevInstance, 
            LPSTR lpCmdLine, 
            int nShowCmd)
{
    LPWSTR *szArglist;
    int nArgs, i;
    
    szArglist = CommandLineToArgvW(GetCommandLineW(), &nArgs);
    for (i = 0; i < nArgs; i++)
    {
        MessageBoxW(NULL, szArglist[i], L"", 0);
    }
    return 0;
}

只可惜没有CommandLineToArgvA函数,想用ANSI版的话得自己用WideCharToMultiByte函数转换一下。

在C语言程序中使用cURL库(libcurl)

2010年10月4日,星期一

cURL本身就是用C语言写的,当然可以在C语言中使用。但是理论和实践还是有一定距离的,以前研究了好几天才研究出怎样正确的使用libcurl的C语言API,曾经也分享过,不过重建博客的时候没有备份数据库。再写一次吧。

#define CURL_STATICLIB  //必须在包含curl.h前定义

#include <stdio.h>
#include "curl/curl.h"
//以下四项是必须的
#pragma comment ( lib, "libcurl.lib" )
#pragma comment ( lib, "ws2_32.lib" )
#pragma comment ( lib, "winmm.lib" )
#pragma comment ( lib, "wldap32.lib" )

int main(void)
{
	CURL *curl;
	CURLcode res;
	curl = curl_easy_init();
	if(curl)
	{
		curl_easy_setopt(curl, CURLOPT_URL, 
                           "http://ipv6.google.com");
		res = curl_easy_perform(curl);
		curl_easy_cleanup(curl);
	}
	return 0;
}

Visual C++ 6.0下编译通过。附上我编译的libcurl.lib:

[download id=48]

参考链接:libcurl – C API

EditPlus注册机及其算法

2010年09月23日,星期四

一切源于正则表达式。EditPlus之支持部分正则表达式,我想找一个对正则表达式支持比较好的代码编辑器。不小心点了EditPlus的Check Latest Version菜单,发现最新版EditPlus是3.20,而我的是3.12。查看了一下更新的内容,很失望的发现没有和正则表达式有关的内容。没有就没有吧,我还是要更新的。

下载了最新版的安装文件,安装。打开EditPlus,提示需要注册码。以前都是随便Google一个填上去就完了,但是这样EditPlus中写的授权都是别人的ID,看着不爽。于是搜索了一下有没有注册机,别说,还真有。但是以前下过的有些注册机是带病毒的,在我的电脑还有杀毒软件的时候,有个注册机直接把卡巴斯基干掉了。更何况现在电脑处于裸奔状态,注册机的病毒想搞破坏那是再简单不过了。

Google关键词“EditPlus 注册机”的时候竟然还搜索出了与“EditPlus 注册机源码”有关的内容。有源码就好办了,自己按照源码写一个呗。后来才发现那个注册码算法是错的,只生成的注册码的前5位,浪费我时间。

再后来,我反汇编了一个EditPlus注册机,花了一天时间才从中找出了注册码的正确算法。唉,没办法,水平太低了。

在VC中编译运行程序的小知识点

2010年09月21日,星期二

1、Run-Time Library

Run-Time Library是编译器提供的标准库,提供一些基本的库函数和系统调用。
我们一般使用的Run-Time Library是C Run-Time Libraries。当然也有Standard C++ libraries。
C Run-Time Libraries实现ANSI C的标准库。VC安装目录的CRT目录有C Run-Time库的大部分源代码。

C Run-Time Libraries有静态库版本,也有动态链接库版本;有单线程版本,也有多线程版本;还有调试和非调试版本。
可以在"project"->"settings"->"C/C++"->"Code Generation"中选择Run-Time Library的版本。

动态链接库版本:
/MD Multithreaded DLL                    使用导入库MSVCRT.LIB
/MDd Debug Multithreaded DLL       使用导入库MSVCRTD.LIB

静态库版本:
/ML Single-Threaded                       使用静态库LIBC.LIB
/MLd Debug Single-Threaded          使用静态库LIBCD.LIB
/MT Multithreaded                           使用静态库LIBCMT.LIB
/MTd Debug Multithreaded              使用静态库LIBCMTD.LIB

C Run-Time Library的标准io部分与操作系统的关系很密切,在Windows上,CRT的io部分代码只是一个包装,底层要用到操作系统内核kernel32.dll中的函数,在编译时使用导入库kernel32.lib。这也就是为什么在嵌入式环境中,我们一般不能直接使用C标准库。

(更多…)