2012年10月20日星期六

InternetGetCookie.Cpp


/*
获取cookie的函数困扰了我几个星期,网上很少找到示例。
微软的示例让人很难理解,很繁琐。

最终还是靠自己大胆的实验来证明,用自己的方法,所以:
made by correy
made at 2012.10.20
homepage:http://correy.webs.com
以前也许知道这,认为小事一桩,不削一顾,
可真正实现的时候,发现还是有点麻烦。
脚本的就不说了。很简单。
*/

#include <windows.h>

#include <Wininet.h>
#pragma comment(lib, "Wininet.lib")

#include <Shlobj.h>
#pragma comment(lib, "Shell32.lib")

int  main( int  argc,  char *  argv[])
{
    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    //这个我就不再写函数了,函数的声明可以定义为:bool get_cookie(IN TCHAR wsz_url, OUT TCHAR wsz_cookie);

    TCHAR szURL[256] = L"http://www.163.com";//注意:http://不可却。
    LPTSTR lpszData = 0;//这个也可以预先定义大小,但最好是动态获取。
    DWORD dwSize=0;

    //获取大小。
    bool b = InternetGetCookie(szURL, NULL, lpszData, &dwSize);
    if (!dwSize && b == false)
    {
        MessageBox(0,L"没有Cookie",szURL,0);//并非都有,有的没有。
        return 0;
    }

    lpszData = new TCHAR[dwSize];

    b = InternetGetCookie(szURL, NULL, lpszData, &dwSize);
    if (b && dwSize) //此时的dwSize的值是上面获取的一半。
    {
        MessageBox(0,lpszData,szURL,0);
    }

    delete[]lpszData;

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    //一下是设置或者改变Cookie,可以有两种形式,但必须配对使用方可成功。不能混合使用。
    //这个也可以写为函数,里面多一个日期的设置。
    //函数原型建议为:bool set_cookie(IN TCHAR wsz_url, IN TCHAR wsz_cookie);

    b = InternetSetCookie(szURL, NULL, TEXT("TestData = Test"));//这个方式,最后一个参数里面必须有等号。
    b = InternetSetCookie(szURL, NULL, TEXT("TestData = Test; expires = Sat,01-Jan-2015 00:00:00 GMT"));//显示用的。

    b = InternetSetCookie(szURL, L"QQ", TEXT("112426112"));  //这个会自动加等号。
    //b = InternetSetCookie(szURL, NULL, TEXT("QQ = 112426112"));
    b = InternetSetCookie(szURL, NULL, TEXT("QQ = 112426112; expires = Sat,01-Jan-2015 00:00:00 GMT"));

    //b = InternetSetCookie(szURL, L"email", TEXT("kouleguan@hotmail.com"));
    b = InternetSetCookie(szURL, NULL, TEXT("email = kouleguan@hotmail.com"));
    b = InternetSetCookie(szURL, NULL, TEXT("email = kouleguan@hotmail.com; expires = Sat,01-Jan-2015 00:00:00 GMT"));

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
    /*
    关于cookie的位置,

    1.SHGetSpecialFolderPath函数的CSIDL_COOKIES参数应该能获取。
      例如:在win 7 32里面是:C:\Users\Administrator\AppData\Roaming\Microsoft\Windows\Cookies
      这个Cookies文件夹默认是隐藏的。
      这里的名字带后缀.txt,但名字好像加密了。
      里面有个Low目录。

    2.internet选项->常规选项卡的浏览历史记录的设置按钮->internet临时文件的当前位置。
      例如:在win 7 32里面是:C:\Users\Administrator\AppData\Local\Microsoft\Windows\Temporary Internet Files。
      这个文件夹Temporary Internet Files,默认页式隐藏的。
      这里的名字例如:Cookie:administrator@163.com/
      其实这里的文件指向上面。也许是因为上面的不好找,加密了。

    */

    TCHAR sz_cookie[MAX_PATH] = {0};
    b = SHGetSpecialFolderPath(0,sz_cookie,CSIDL_COOKIES,0);
    if (b)
    {
        MessageBox(0,sz_cookie,L"cookie的目录是:",0);//或者直接打开目录。
    }

    ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////

    return   0 ;
}

/*
参考:
InternetGetCookie:
http://msdn.microsoft.com/en-us/library/aa384710(v=vs.85).aspx

InternetSetCookie:
http://msdn.microsoft.com/en-us/library/aa385107(v=vs.85).aspx

Managing Cookies:
http://msdn.microsoft.com/en-us/library/aa385326(v=vs.85).aspx

HTTP Cookies:
http://msdn.microsoft.com/en-us/library/aa384321(v=vs.85).aspx

还有扩展的:InternetGetCookieEx,InternetSetCookieEx就不说了。
*/

没有评论:

发表评论