VBS获取程序自身的路径很简单
WScript.Echo WScript.ScriptFullName
C语言其实也也很简单,只可惜以前太菜
TCHAR szFileName[MAX_PATH]; GetModuleFileName(NULL, szFileName, MAX_PATH); MessageBox(NULL, szFileName, TEXT(""), 0);
VBS获取程序自身的路径很简单
WScript.Echo WScript.ScriptFullName
C语言其实也也很简单,只可惜以前太菜
TCHAR szFileName[MAX_PATH]; GetModuleFileName(NULL, szFileName, MAX_PATH); MessageBox(NULL, szFileName, TEXT(""), 0);
在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函数转换一下。
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之支持部分正则表达式,我想找一个对正则表达式支持比较好的代码编辑器。不小心点了EditPlus的Check Latest Version菜单,发现最新版EditPlus是3.20,而我的是3.12。查看了一下更新的内容,很失望的发现没有和正则表达式有关的内容。没有就没有吧,我还是要更新的。
下载了最新版的安装文件,安装。打开EditPlus,提示需要注册码。以前都是随便Google一个填上去就完了,但是这样EditPlus中写的授权都是别人的ID,看着不爽。于是搜索了一下有没有注册机,别说,还真有。但是以前下过的有些注册机是带病毒的,在我的电脑还有杀毒软件的时候,有个注册机直接把卡巴斯基干掉了。更何况现在电脑处于裸奔状态,注册机的病毒想搞破坏那是再简单不过了。
Google关键词“EditPlus 注册机”的时候竟然还搜索出了与“EditPlus 注册机源码”有关的内容。有源码就好办了,自己按照源码写一个呗。后来才发现那个注册码算法是错的,只生成的注册码的前5位,浪费我时间。
再后来,我反汇编了一个EditPlus注册机,花了一天时间才从中找出了注册码的正确算法。唉,没办法,水平太低了。
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标准库。