wininet源代码获取例子

wininet源代码获取例子

#include <windows.h>
#include <wininet.h>
#pragma comment(lib, "wininet")
#define ID_URLEDITBOX    1
#define ID_GETBUTTON    2
#define ID_SHOWEDITBOX    3
LRESULT CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
                    PSTR szCmdLine, int iCmdShow)
{
    static TCHAR szAppName[] = TEXT ("BtnLook") ;
    HWND         hwnd ;
    MSG          msg ;
    WNDCLASS     wndclass ;
    wndclass.style         = CS_HREDRAW | CS_VREDRAW ;
    wndclass.lpfnWndProc   = WndProc ;
    wndclass.cbClsExtra    = 0 ;
    wndclass.cbWndExtra    = 0 ;
    wndclass.hInstance     = hInstance ;
    wndclass.hIcon         = LoadIcon (NULL, IDI_APPLICATION) ;
    wndclass.hCursor       = LoadCursor (NULL, IDC_ARROW) ;
    wndclass.hbrBackground = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
    wndclass.lpszMenuName  = NULL ;
    wndclass.lpszClassName = szAppName ;
    if (!RegisterClass (&wndclass))
    {
        MessageBox (NULL, TEXT ("This program requires Windows NT!"),
            szAppName, MB_ICONERROR) ;
        return 0 ;
    }
    hwnd = CreateWindow (szAppName, TEXT ("WinINet源代码获取"),
        WS_OVERLAPPEDWINDOW,
        GetSystemMetrics (SM_CXSCREEN) / 4, GetSystemMetrics (SM_CYSCREEN) / 4,
        GetSystemMetrics (SM_CXSCREEN) / 2, GetSystemMetrics (SM_CYSCREEN) / 2,
        NULL, NULL, hInstance, NULL) ;
    ShowWindow (hwnd, iCmdShow) ;
    UpdateWindow (hwnd) ;
    while (GetMessage (&msg, NULL, 0, 0))
    {
        TranslateMessage (&msg) ;
        DispatchMessage (&msg) ;
    }
    return msg.wParam ;
}
LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
{
    static HWND hwndUrlEdt,hwndGetBtn,hwndShowEdt;
    HINTERNET hConnect,hRequest,hSession;
    LPTSTR lpszHost;
    char szBuffer[1024*1024/10];
    TCHAR szStr[100];
    DWORD dwSize=0;
    DWORD dwDownloaded;
    static LPCTSTR pAcceptType[] = { TEXT("Accept: */*"), NULL };
    switch (message)
    {
    case WM_CREATE:
        hwndUrlEdt = CreateWindow (TEXT ("EDIT"), NULL,
            WS_CHILD | WS_VISIBLE |  WS_BORDER | ES_LEFT | ES_AUTOHSCROLL    ,
            20,20,500,20, hwnd, (HMENU)ID_URLEDITBOX,
            ((LPCREATESTRUCT) lParam) -> hInstance, NULL) ;
        hwndGetBtn = CreateWindow (TEXT ("BUTTON"), TEXT("GO"),
            WS_CHILD | WS_VISIBLE |  BS_DEFPUSHBUTTON   ,
            530,20,30,20, hwnd, (HMENU)ID_GETBUTTON,
            ((LPCREATESTRUCT) lParam) -> hInstance, NULL) ;
        hwndShowEdt = CreateWindow (TEXT ("EDIT"), TEXT(""),
            WS_CHILD | WS_VISIBLE | WS_BORDER | WS_HSCROLL | WS_VSCROLL |  ES_AUTOHSCROLL | ES_AUTOVSCROLL | ES_MULTILINE  ,
            20,60,600,250, hwnd, (HMENU)ID_SHOWEDITBOX,
            ((LPCREATESTRUCT) lParam) -> hInstance, NULL) ;
        return 0;
    case WM_COMMAND:
        if(LOWORD(wParam) == ID_GETBUTTON)
        {
            GetWindowText(hwndUrlEdt,szStr,sizeof(szStr)/sizeof(TCHAR));
            hSession = InternetOpen(TEXT("testWinINet"), PRE_CONFIG_INTERNET_ACCESS, NULL, INTERNET_INVALID_PORT_NUMBER, 0);
            hConnect = InternetOpenUrl(hSession,szStr,NULL,0,INTERNET_FLAG_DONT_CACHE,0);
            ZeroMemory(szBuffer,sizeof(szBuffer));
            while (InternetReadFile(hConnect,szBuffer,sizeof(szBuffer),&dwDownloaded))
            {
                if (0==dwDownloaded) break;
                szBuffer[dwDownloaded]=0;
            }
            SetWindowText(hwndShowEdt,szBuffer);
            ZeroMemory(szBuffer,sizeof(szBuffer));
        }
        return 0;
    }
    return DefWindowProc (hwnd, message, wParam, lParam) ;
}

程序缺点很多,1是点击“GO”之后,获取源代码的时候会卡住,因为没有用多线程,
2,存储源代码的内存空间受到了限制,csdn上面的人说受vc编译器堆栈大小的限制,超出了就stack overflow了。目前我只能使用临时文件存储的方法来解决。
3是子窗口都是使用代码写的,所以字体都是默认的fixedsys“system”,中文字体十分难看。
4是字符串如果不是gb2312和纯英文的,其他字符串全部乱码,如上图就是一个最好的例证。

说了这么多缺点,说出来以后“深造”后再修正吧。嘎嘎~~

wordpress“快速发布”微博

将wordpress的后台“快速发布”修改为微博消息发布: 因为对wordpress插件机制还不是很熟悉,直接修改源代码,而不是通过插件实现。 方法如下: 修改wp-includes/post.php,将2218行

$post_name = sanitize_title($post_title);

修改为

if(!isset($postarr['quickpress_post_ID']))//快速发布
{
    $post_name = sanitize_title($post_title);
}
else//快速发布
{
        $post_name  = time();
        $post_title =mb_substr($post_content, 0,30);
}

修改wp-admin/includes/dashboard.php,455行

<input type="text" name="tags_input" id="tags-input" tabindex="3" value="<?php echo get_tags_to_edit( $post->ID ); ?>" />

修改为

<input type="text" name="tags_input" id="tags-input" tabindex="3" value="<?php echo get_tags_to_edit( $post->ID ); ?>microblogging" />

这样在后台就能发“微博”了。 这次彻底放弃使用twitter等微博的原因是 1.没人气,不好玩。 2.不能写代码片段,发图等问题。 3.字数限制,和2接近的一个原因。

导入twitter数据到wordpress

twitter的备份工具很多,tweet backup,tweettake,导出的格式有txt,csv,没有我想要的sql脚本。所以使用这个使用这个项目的代码:http://code.google.com/p/tbackup/
将proccess.php的第75行到97行的代码修改为:

//$text = iconv('UTF-8', CHARSET, $status->text);
//$text = str_replace('"', '""', $text);
//fwrite($file, $datestr . '$$$' . $status->id . '$$$' . $text . '$$$' . chr(13) . chr(10));
$text = $status->text;
$link_id = mysql_connect("localhost", "user", "pass") or
die("Could not connect: " . mysql_error());
mysql_select_db('wpdb');
mysql_query("set names utf8");
$title = substr($text, 0, 60);
$sql = "INSERT INTO `jq_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`,
`post_category`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`,
`pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`,
`post_mime_type`, `comment_count`)
VALUES (NULL, '1', '$datestr', CONVERT_TZ('$datestr','+08:00','+00:00'), '$text', '$title', '0', '', 'publish', 'open', 'open', '', unix_timestamp('$datestr'), '', '',
'$datestr',CONVERT_TZ('$datestr','+08:00','+00:00') , '', '0', unix_timestamp('$datestr'), '0', 'post', '', '0');";
mysql_query($sql);
$insert_id = mysql_insert_id($link_id);
mysql_query("insert into wp_term_relationships values ($insert_id,770,0) "); //将770改为对应的term_taxonomy_id
mysql_query("update wp_term_taxonomy set count=count+1 where term_taxonomy_id=770 ");//将770改为对应的term_taxonomy_id

将所有代码上传到网站目录,输入twitter ID,点Start,等待一段时间,所有数据就导入了wordpress。

至此搞了四天,将饭否,嘀咕,twitter的数据都导入到了wordpress博客之中。所有的微博数据在 http://tunps.com/tag/microblogging

整合嘀咕数据到wordpress中

首先使用去年写的嘀咕备份工具(现有出现了乱码的问题,空了再解决)下载所有嘀咕数据(消息,图片),然后导入到本地的mysql数据中,把数据库中的status表导入到你wordpress数据库中:

整合嘀咕数据到wordpress中

然后将以下代码保存为php文件,放在网站上运行一次:

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<?php
$img_new_path = 'http://tunps.com/wp-content/myuploads/2011/01/';
$link_id = mysql_connect("localhost", "user", "pass") or
        die("Could not connect: " . mysql_error());
mysql_select_db('wp');
mysql_query("set names utf8");
$result = mysql_query("select * from status");
while ($row = mysql_fetch_assoc($result)) {
    if ($row['in_reply_to_status_id'] == '0')
        {
        $title = substr($row['text'], 0, 60);
        if ($row['text'] == '') {
            $title = '无标题';
        }
        $sql = "INSERT INTO `jq_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`,
            `post_category`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`,
            `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`,
            `post_mime_type`, `comment_count`)
            VALUES (NULL, '1', '$row[created_at]', CONVERT_TZ('$row[created_at]','+08:00','+00:00'), '$row1', '$title', '0', '', 'publish', 'open', 'open', '', unix_timestamp('$row[created_at]'), '', '',
            '$row[created_at]',CONVERT_TZ('$row[created_at]','+08:00','+00:00') , '', '0', unix_timestamp('$row[created_at]'), '0', 'post', '', '0');";
        mysql_query($sql);
        $insert_id = mysql_insert_id($link_id);
        mysql_query("insert into wp_term_relationships values ($insert_id,770,0) "); //将770改为对应的term_taxonomy_id
        mysql_query("update wp_term_taxonomy set count=count+1 where term_taxonomy_id=770 ");//将770改为对应的term_taxonomy_id
        //如果不含图片/插入一行记录post
        if ($row['picPath'] == '') {
        } else
            {
            //http://pic.minicloud.com.cn:80/file/10/02/58/10/201003/7868626c6629a84bbe60828fbaeac0d3_100x75.jpg
            $url = $row['picPath'];
            $filename = substr($url, strrpos($url, '/') + 1, strlen($url));
            $filename = str_replace('100x75', '640x480', $filename);
            $url = $img_new_path . $filename;
            $sql = "INSERT INTO  `jq_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`,
                `post_category`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`,
                `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`,
                `post_mime_type`, `comment_count`)
                VALUES (NULL, '1', '$row[created_at]', CONVERT_TZ('$row[created_at]','+08:00','+00:00'), '', '$filename', '0', '', 'inherit', 'open', 'open', '', '$filename', '', '',
                '$row[created_at]',CONVERT_TZ('$row[created_at]','+08:00','+00:00') , '', '$insert_id', '$url', '0', 'attachment', 'image/jpeg', '0');";
            mysql_query($sql);
            $img_id = mysql_insert_id($link_id);
            //文章插入图片
            $img_tag = '<br /><a href="' . $url . '"><img class="alignleft size-full wp-image-' . $img_id . '" title="' . $filename . '" src="' . $url . '" alt="" /></a>';
            $img_tag = addslashes($img_tag);
            $sql = "update wp_posts set post_content=concat(post_content,'$img_tag') where ID=$insert_id";
            mysql_query($sql);
        }
    }
}
echo 'ok';
?>

完成!

整合饭否数据到wordpress中

饭否是2007.5上线,2009.7.8饭否关闭,原因大家都知道,从此大量的饭否粉丝苦苦等待饭否的重新上线。饭否是我第一个使用的微博服务,我也在等待之列,在2010.3.1饭否推出了一个数据导出功能。最近做了一个决定:将我的所有微博消息(饭否、嘀咕、twitter)整合到此wordpress博客中,让这里博客、微博进行“合体”。本人先后使用饭否(2007-11-09到2009-7-06),嘀咕(2009-04-16到2010-03-23),twitter(2008-10-08至今)。先把饭否整合到wordpress中,饭否的数据来自备份的文件中:

album.html //照片
favorite_1.html  //收藏
privatemsg_receive_1.html //私信收件箱
privatemsg_sent_1.html //私信发件箱
**status_1.html **//消息

我在饭否里面没有怎么使用照片,私信不用公开了,所有只备份消息。不知道为啥每个文件都是“_1”,估计1000条消息为一个文件,我消息没有超过1000。分析了一下status_1.html,发现加载了yui 2 javascript框架,但折腾了一下午发现yui 2用得很不上手。只有用jquery,全部代码如下:

$(document).ready(function(){
        var list=$("ol li");
        list.each(function(i){
            if($(".content")[i].innerHTML.substring(0,1) == '@')//忽略@别人的聊天消息
            {}
            else
            {
                var gmtTimeStr=$(".stamp")[i].childNodes[0].getAttribute("stime");
                var date_arr=gmtTimeStr.split(" ");
                var year     =     date_arr[5];
                var month     =     date_arr[1];
                var day        =    date_arr[2];
                var time    =    date_arr[3];
                var time_arr = time.split(":");
                var hour    = time_arr[0];
                var minute    = time_arr[1];
                var second    = time_arr[2];
                switch(month)
                {
                    //January February  March April May June July August September October November December//默写不出来鸟,老了。
                    case 'Jan': month = 01; break;
                    case 'Feb': month = 02; break;
                    case 'Mar': month = 03; break;
                    case 'Apr': month = 04; break;
                    case 'May': month = 05; break;
                    case 'Jun': month = 06; break;
                    case 'Jul': month = 07; break;
                    case 'Aug': month = 08; break;
                    case 'Sep': month = 09; break;
                    case 'Oct': month = 10; break;
                    case 'Nov': month = 11; break;
                    case 'Dec': month = 12; break;
                }
                var newGmtTimeStr     =     year + '-' + month + '-' + day + ' ' + time;
                var localTimeObj = new Date(year,month,day,hour,minute,second);
                localTimeObj.setHours(localTimeObj.getHours()+8);
                var post_name = localTimeObj.getTime();
                var date_arr=localTimeObj.toString().split(" ");
                var year     =     date_arr[3];
                var month     =     date_arr[1];
                var day        =    date_arr[2];
                var time    =    date_arr[4];
                var time_arr = time.split(":");
                var hour    = time_arr[0];
                var minute    = time_arr[1];
                var second    = time_arr[2];
                switch(month)
                {
                    //January February  March April May June July August September October November December
                    case 'Jan': month = 0; break;
                    case 'Feb': month = 1; break;
                    case 'Mar': month = 2; break;
                    case 'Apr': month = 3; break;
                    case 'May': month = 4; break;
                    case 'Jun': month = 5; break;
                    case 'Jul': month = 6; break;
                    case 'Aug': month = 7; break;
                    case 'Sep': month = 8; break;
                    case 'Oct': month = 9; break;
                    case 'Nov': month = 10; break;
                    case 'Dec': month = 11; break;
                }
                var localTime = year + '-' + month + '-' + day + ' ' + hour+':'+minute+':'+second;
                var content     =    $(".content")[i].innerHTML;
                content = content.replace(/\'/g,"\\'");
                var title = content.substring(0,60);
                $("#sql").text( $("#sql").text() + "INSERT INTO `tunps`.`jq_posts` (`ID`, `post_author`, `post_date`, `post_date_gmt`, `post_content`, `post_title`, `post_category`, `post_excerpt`, `post_status`, `comment_status`, `ping_status`, `post_password`, `post_name`, `to_ping`, `pinged`, `post_modified`, `post_modified_gmt`, `post_content_filtered`, `post_parent`, `guid`, `menu_order`, `post_type`, `post_mime_type`, `comment_count`) VALUES (NULL, '1', '"+localTime+"', '"+newGmtTimeStr+"', '"+content+"', '"+title+"', '0', '', 'publish', 'open', 'open', '', '"+post_name+"', '', '', '0000-00-00 00:00:00', '0000-00-00 00:00:00', '', '0', '', '0', 'post', '', '0');" + '\n');
            }
        });
});

以上js最好在chrome下面运行,因为太消耗内存了,chrome运行5秒钟,cpu占用50%左右,内存100多MB。差点被javascript的Date对象搞晕了,之所以耗内存cpu资源是因为代码的问题,可以解决问题就行,优化就不考虑了。
生成如下的sql脚本:

整合饭否数据到wordpress中

拷贝到phpmyadmin中运行就导入到了wordpress中。wordpress日志默认是按wp_posts.post_date而非post_date_gmt,这点需要注意。 如果你想让所有饭否的数据都放在一个单独的目录并命名为“碎碎念”,你可以在wordpress后台新建一个“碎碎念”的目录(数据库里面会在wp_terms和wp_term_taxonomy新建一行数据,记录下wp_term_taxonomy.term_taxonomy_id,我的是770,记录下饭否数据插入wp_posts的起止ID,我的是1736到2454,然后写个php文件:

$link_id = mysql_connect("localhost", "用户名", "密码") or
        die("Could not connect: " . mysql_error());
mysql_select_db('数据库名字');
$i=1736;
while($i<=2454)
{
    mysql_query("insert into wp_term_relationships values ($i,770,0) ");
    $i++;
}

上传到网站,运行这个php脚本,目的是为了让所有的饭否数据都归入“碎碎念”目录。
然后手动修改wp_term_taxonomy.count为饭否的消息条数就可以了。

wordpress删除所有post_type为revision的post

DELETE a,b,c
FROM wp_posts a
LEFT JOIN wp_term_relationships b ON (a.ID = b.object_id)
LEFT JOIN wp_postmeta c ON (a.ID = c.post_id)
WHERE a.post_type = ‘revision’;

跨表delete,sql语句来自http://www.ludou.org/wordpress-post-id-continuous.html

vmware workstation SCSI硬盘驱动

2年前说过关于“windows xp安装sata硬盘驱动”的问题,在vmware workstation 安装原版windows xp(zh-hans_windows_xp_professional_with_service_pack_3_x86_cd_vl_x14-74070.iso,MD5: E74D72F3D90456003E9E02BA0FB7DA61 / SHA1: D142469D0C3953D8E4A6A490A58052EF52837F0F)的时候,报错识别不了硬盘:

vmware workstation SCSI硬盘驱动

原因是vmware使用的scsi硬盘,而非ide硬盘。安装的时候需要scsi驱动,不过还好vmware肯定带了scsi驱动,而且还是开发源代码的。这里下载驱动/驱动源码

在VM->Settings->Floppy设定为D:appvmware workstation 7Resourcesvmscsi.flp(你的vmscsi.flp文件路径)。

启动虚拟机,进入下面画面的时候按F6

vmware workstation SCSI硬盘驱动

vmware workstation SCSI硬盘驱动

按”S”,指定软盘里面的驱动

vmware workstation SCSI硬盘驱动

回车,回车,接下来的安装过程就不多说了。

Error happened to Foxit PDF Creator, installation might not be complete. Make sure you have the administrative privilege.

不要怀疑是权限了问题了,哪个你“run as administrator” 也不会安装成功。

解决方法:
右键点击我的电脑->服务->Printer Spooler,双击打开设置页面,将 类型设置为 自动,并且 点击 服务状态下面对应的“启动”,确定,即可。以后系统启动,就会自动打开此服务了,这样打印机就可以用了。

因为Foxit PDF Creator安装的时候要安装一个虚拟打印机的驱动,Printer Spooler服务没有打开那肯定没搞。当初为了节约一点系统资源,对于根本没有打印机的用户来说,Printer Spooler禁用也好,不过当时没有考虑到虚拟打印机这么个东东。

神马都是浮云,神马都是CRUD

今天看了一文 “软件天才都是训练出来的”,里面的一个配图(一个.net程序员开发通用的crud程序需要掌握的知识):

神马都是浮云,神马都是CRUD

原来这几年我都是围绕着CRUD在忙活。oh,shit!!! 不仅如此,我感觉国内搞IT技术的大多都是围绕着这玩意儿在忙活。兴许这就是“IT民工”这个词汇的来源。软件天才都是训练出来的。

VC在编译链接的无故卡死解决方案(防VC6卡死)

现在网上有很多集成了SP6的VC6,但是使用起来会有些某名奇妙的问题,也许是我用的龙卷风那个版本不行,最常见的就是VC在编译链接的时候经常无故卡死的问题了,发生时候关也关不掉,停也停不了,只能在任务管理器中强行关闭。这个问题困扰了我很久,也是直接促使我改换更高版本VC的直接原因,但是为什么我就没想到是我VC6的版本问题呢?直到后来偶然在网上看到了解决方法,那就从微软的网站上下载SP6补丁重新安装,果然问题就解决了,记住:不要相信你的关于对话框中显示的SP6版本信息,真正的SP6补丁打上之后你根本看不到SP6的字眼。初学VC的人最容易遇到的问题,就是VC6在编译的时候,linking…..,一直就这样link下去,打击了多少渴望掌握VC的人。网上的所谓vc集成sp6版本,由于没有测试完全,留下了bug,导致非常容易link卡死,由于这些版本自称集成了sp6,这造成了假象迷惑了非常多的vc学习者。解决vc6卡死的办法就是打上官方的原版VC6sp6补丁|VS6sp6补丁。下载地址如下:请看清你需要的是中文还是英文:

英文版地址:

http://download.microsoft.com/download/1/9/f/19fe4660-5792-4683-99e0-8d48c22eed74/Vs6sp6.exe

简体中文版地址:
http://download.microsoft.com/download/e/c/9/ec94a5d4-d0cf-4484-8b7a-21802f497309/Vs6sp6.exe

那是因为你没安装VC++6.0的SP6补丁,VC++6最稳定的版本的版本号是6.0.9782.2,如果你的msdev.exe文件版本不是这个,那就表示没有安装SP6补丁

VC在编译链接的无故卡死解决方案(防VC6卡死)

你可以直接去Microsoft网站上下载SP6补丁的安装包,装上就好了。

 

VC6在64位Windows7下调试的时候,再结束调试,程序无法退出。

问题描述:当我击F5开始一个项目的调试时,程序在我设置的断点处停止,这时我按下Shift+F5后,vc6可以退出调试状态,但是WINDOWS系统的任务栏上会留下前面调试时产生的进程图标。该进程不能被结束,即使我使用任务管理器,也不可以。这时如果我再次按下F5,并按下Shift+F5后,任务栏上会留下两个这样的图标,这两个进程都可以在任务管理器上看到,不占CPU资源,但占用一定的内存。我想结束该进程的唯一的办法是(在任务栏上去掉该图标):关闭VC6,并重新开启。

一般的解决方法:不使用”结束调试”这个功能,让程序正常结束(就是放个可以退出的菜单或者按钮, 而不是使用Shift+F5的退出)。终极解决方法:检查文件DM.dll版本,DM.dll在程序安装目录的“Common/MSDev98/Bin”。正确的版本是6.0.9782.0。下载TLLOC.DLL,将下载的版本替换到程序安装目录“Common/MSDev98/Bin/TLLOC.dll” 将6.0.8168.292替换掉6.0.8168.0这样VC6在windows 7 64位的系统调试时,就可以任意退出了。