醉卧沙场君莫笑 古来征战几人回
RSS icon Email icon Home icon
  • variant 变量表

    Posted on 十月 24th, 2009 admin No comments

    老是要查头文件,又排得不整齐,排一份如下:

    LONGLONG      llVal;        /* VT_I8                */ LONG          lVal;         /* VT_I4                */ BYTE          bVal;         /* VT_UI1               */ SHORT         iVal;         /* VT_I2                */ FLOAT         fltVal;       /* VT_R4                */ DOUBLE        dblVal;       /* VT_R8                */ VARIANT_BOOL  boolVal;      /* VT_BOOL              */ SCODE         scode;        /* VT_ERROR             */ CY            cyVal;        /* VT_CY                */ DATE          date;         /* VT_DATE              */ wireBSTR      bstrVal;      /* VT_BSTR              */ IUnknown *    punkVal;      /* VT_UNKNOWN           */ IDispatch *   pdispVal;     /* VT_DISPATCH          */ wirePSAFEARRAY parray;      /* VT_ARRAY             */ BYTE *        pbVal;        /* VT_BYREF|VT_UI1      */ SHORT *       piVal;        /* VT_BYREF|VT_I2       */ LONG *        plVal;        /* VT_BYREF|VT_I4       */ LONGLONG *    pllVal;       /* VT_BYREF|VT_I8       */ FLOAT *       pfltVal;      /* VT_BYREF|VT_R4       */ DOUBLE *      pdblVal;      /* VT_BYREF|VT_R8       */ VARIANT_BOOL *pboolVal;     /* VT_BYREF|VT_BOOL     */ SCODE *       pscode;       /* VT_BYREF|VT_ERROR    */ CY *          pcyVal;       /* VT_BYREF|VT_CY       */ DATE *        pdate;        /* VT_BYREF|VT_DATE     */ wireBSTR *    pbstrVal;     /* VT_BYREF|VT_BSTR     */ IUnknown **   ppunkVal;     /* VT_BYREF|VT_UNKNOWN  */ IDispatch **  ppdispVal;    /* VT_BYREF|VT_DISPATCH */ wirePSAFEARRAY *pparray;    /* VT_BYREF|VT_ARRAY    */ wireVARIANT * pvarVal;      /* VT_BYREF|VT_VARIANT  */ CHAR          cVal;         /* VT_I1                */ USHORT        uiVal;        /* VT_UI2               */ ULONG         ulVal;        /* VT_UI4               */ ULONGLONG     ullVal;       /* VT_UI8               */ INT           intVal;       /* VT_INT               */ UINT          uintVal;      /* VT_UINT              */ DECIMAL       decVal;       /* VT_DECIMAL           */ DECIMAL *     pdecVal;      /* VT_BYREF|VT_DECIMAL  */ CHAR *        pcVal;        /* VT_BYREF|VT_I1       */ USHORT *      puiVal;       /* VT_BYREF|VT_UI2      */ ULONG *       pulVal;       /* VT_BYREF|VT_UI4      */ ULONGLONG *   pullVal;      /* VT_BYREF|VT_UI8      */ INT *         pintVal;      /* VT_BYREF|VT_INT      */ UINT *        puintVal;     /* VT_BYREF|VT_UINT     */

  • 透明窗口,连鼠标键盘事件也不接受,全透明

    Posted on 八月 1st, 2009 admin No comments

    windows的透明窗口,如果设置了LWA_ALPHA和WS_EX_TRANSPARENT,就会连鼠标键盘事件也给透明过去,这个功能还不错。可以在屏上显示水印。

    关键代码:

    SetWindowLong(m_hWnd, GWL_EXSTYLE, WS_EX_LAYERED|WS_EX_TRANSPARENT|WS_EX_TOPMOST);
     SetLayeredWindowAttributes(m_hWnd, RGB(0,0,0), 120, LWA_ALPHA);
     SetWindowPos(m_hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOMOVE|SWP_SHOWWINDOW);

    demo代码:

    static LRESULT WINAPI UIWndProcBase(HWND hWnd, UINT msg, WPARAM wParam, LPARAM lParam) {  if (msg == WM_PAINT)  {   PAINTSTRUCT ps;   BeginPaint(hWnd, &ps);   //OnPaint(ps.hdc);   EndPaint(hWnd, &ps);  }  else if (msg == WM_DESTROY)  {   PostQuitMessage(0);  }  return DefWindowProc(hWnd, msg, wParam, lParam); } void UIRun() {  WNDCLASSEX wc = {sizeof(wc)};  wc.hInstance     = GetModuleHandle(0);  wc.lpszClassName = _T("uiclassname");  wc.lpfnWndProc   = &UIWndProcBase;  wc.hbrBackground = (HBRUSH)GetStockObject(WHITE_BRUSH);  RegisterClassEx(&wc);  wstring ws = L"aaabbcd";  HWND hParent = CreateWindowExW(WS_EX_TRANSPARENT, _T("EDIT"), _T(""),  WS_POPUP, 0, 0, 100, 100, 0, NULL, wc.hInstance, NULL);  HWND m_hWnd = CreateWindowEx(0, wc.lpszClassName, ws.c_str(),  WS_POPUP, 0, 0, 100, 100,   hParent, NULL, wc.hInstance, NULL);  SetWindowLong(m_hWnd, GWL_EXSTYLE, WS_EX_LAYERED|WS_EX_TRANSPARENT|WS_EX_TOPMOST);  SetLayeredWindowAttributes(m_hWnd, RGB(0,0,0), 120, LWA_ALPHA);  SetWindowPos(m_hWnd, HWND_TOPMOST, 0, 0, 0, 0, SWP_NOACTIVATE|SWP_NOSIZE|SWP_NOMOVE|SWP_SHOWWINDOW);  MSG msg;  while (GetMessage(&msg, 0, 0, 0))  {   TranslateMessage(&msg);   DispatchMessage(&msg);  } } int main() {  UIRun();  return 0; }

  • masm造weak symbol

    Posted on 四月 24th, 2009 admin No comments

    masm或ml.exe可以用alias造weak external symbol,这样可以起到链接时有就选用户提供的,无就选系统默认的这样一个功能。这个语法很简单,但不好找。以前找了又忘了,特记下:

    alias <sym2> = <sym1>

    这次是在这里搜到的:

    http://rs1.szif.hu/~tomcat/win32/win32asm.txt

  • php和mysql支持utf8

    Posted on 四月 15th, 2009 admin No comments

    老生常谈了,网上很多文,我再多写一篇!

    1. my.cnf里加上:
    [client]
    default-character-set=utf8

    [mysqld]
    default-character-set=utf8

    重启mysqld,连上去看看:

    mysql> SHOW VARIABLES LIKE '%character%';SHOW VARIABLES LIKE 'collation%'; +--------------------------+----------------------------+ | Variable_name            | Value                      | +--------------------------+----------------------------+ | character_set_client     | utf8                       | | character_set_connection | utf8                       | | character_set_database   | utf8                       | | character_set_filesystem | binary                     | | character_set_results    | utf8                       | | character_set_server     | utf8                       | | character_set_system     | utf8                       | | character_sets_dir       | /usr/share/mysql/charsets/ | +--------------------------+----------------------------+ 8 rows in set (0.00 sec) +----------------------+-----------------+ | Variable_name        | Value           | +----------------------+-----------------+ | collation_connection | utf8_general_ci | | collation_database   | utf8_general_ci | | collation_server     | utf8_general_ci | +----------------------+-----------------+ 3 rows in set (0.00 sec)

    2. php里也要改,写个函数:

    <?php function connect_db($dbname) {  global $mysql_addr, $mysql_user, $mysql_pass;  $dbcon = mysql_connect($mysql_addr, $mysql_user, $mysql_pass);  mysql_query("SET NAMES 'utf8'; SET CHARACTER_SET_CLIENT=utf8; " ."SET CHARACTER_SET_RESULTS=utf8; ", $dbcon);  if ($dbname)  {   mysql_select_db($dbname, $dbcon);  }  return $dbcon; } ?>

    3. 数据库可以改一下:

    alter database mydb CHARACTER SET  ‘utf8′ ;      

    alter table tablename CHARACTER SET ‘utf8′;

    不过这两句不会改内容,如果内容原来不是utf8的字节,就要导出导入了.

  • N72手机开发软件部署过程

    Posted on 六月 5th, 2008 admin 1 comment

    我的手机是N72,唉,不先进。

    去年给N72写了个软件,现在发现服务器升级用不了了。于是决定改一下。原来配软件花了好久好久,现在发现不太会配了,又折腾了好久才搞定,赶快把过程记下来:

    1. 安装j2re-1_4_2_16-windows-i586-p.exe,不能装新版的或旧版的。//shit
    2. 安装WinPcap_3_1.exe,不能装新版的或旧版的。//shit 2.
    3. 安装ActivePerl-5.6.1.635-MSWin32-x86,不能装新版的或旧版的。//shit 3.
    4. 安装carbide.c++_v1.2.exe。(download from nokia)
    5. 安装s60_2nd_sdk_fp3(其它版本不能用于N72)

    都装完了后,模拟器可以运行了。但是还是不能上网。记得去年折腾了好多天才搞定,现在总结只要两步走:

    首先,在模拟器选项里设好IP,子网掩网,网关,DNS等信息。

    然后,关掉模拟器,运行两条命令:

    C:\Symbian\8.1a\S60_2nd_FP3\Epoc32\Data>set EPOCROOT=\Symbian\8.1a\S60_2nd_FP3\
    C:\Symbian\8.1a\S60_2nd_FP3\Epoc32\Data>perl ../tools/configchange.pl –config ethernetWithCommDB –kernel EKA1 –target winscw –variant UDEB
    就可以了,注意第二条命令运行的目录不能错。

    这样就可以上网了,用慢得像坨屎的carbide c++开发吧。另外这个s60_2nd_sdk_fp3还有几个大BUG,又是一坨屎啊。

    最后,发现carbide用bld.inf文件导入的文件,不会生成.sis文件,又折腾了我好久才搞定!!方法,自己去修改pkg文件,然后手动调用makesis.exe,没啥别的办法。创建的工程carbide是会给生成.sis的,一旦把这个工程移除后再导入,就怎么也不会生成sis了,再一次说:shit!

    生成sis文件命令:

    C:\Symbian\8.1a\S60_2nd_FP3\Epoc32\tools\makesis.exe  myproj__.pkg output.sis -v

    其中myproj__.pkg是从myproj.pkg改来,手动把其中的$(EPOCROOT)等宏展开。

     

    最后,我的程序修正了服务器数据识别,又可以使用了。 真是够折腾的。

  • 一个有意思的warning.

    Posted on 五月 10th, 2008 admin No comments

    今天看下属的代码才发现的,之前还真没碰到过。

    #include <stdio.h> int main() {         for (int i=0; i<10; ++i)         {                 for (int i=0; i<10; ++i)                 {                         ;                 }                 int x = i;         }         return 0; }

    gcc编译:

    debian:~$ gcc t.cc t.cc: In function ‘int main()’: t.cc:10: warning: name lookup of ‘i’ changed t.cc:4: warning:   matches this ‘i’ under ISO standard rules t.cc:6: warning:   matches this ‘i’ under old rules

    vc编译:

    D:\tmp>cl c.cc Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 14.00.50727.762 for 80x86 Copyright (C) Microsoft Corporation.  All rights reserved. c.cc c.cc(10) : warning C4258: 'i' : definition from the for loop is ignored; the def inition from the enclosing scope is used         c.cc(6) : definition of 'i' ignored         c.cc(4) : definition of 'i' used

    如果去掉int x = i;那一行,就没有这个warning。

    这个倒也比较好理解,按照旧规则和新规则,int x=i有两种不同的解释,分别对应两个不同scope里的i。所以就给个warning。

  • 做了Perl 5.10.0的chm文档

    Posted on 四月 27th, 2008 admin 5 comments

    http://perldoc.perl.org/ 上可以看perl的文档。这自然是一件很好的事。

    不过我还是比较习惯看chm的文档,比如我要找函数stat的说明,用网页方式的话我要打开浏览器,上到perldoc网站,定位到perlfunc那一页,再找到stat,这个时候可能是需要ctrl+f一下才找得到的,然后再转过去。有了chm文档,就方便了,打开后在index里输入stat回车即可看了。

    5.8.8的就先不做了,一般也用不到这些差别。

    在这里下载

     

  • perl utf8值得注意的一点

    Posted on 四月 26th, 2008 admin No comments

    use utf8; my $var="测试啊"; print "OK1\n" if ($var=~/试/); printf "str: %s length: %d\n", $var, length($var); $var = `echo $var`; chomp($var); print "OK2\n" if ($var=~/试/); printf "str: %s length: %d\n", $var, length($var);

    结果:

    debian:~# ./test.pl  OK1 Wide character in print at ./test.pl line 11. str: 测试啊 length: 3 str: 测试啊 length: 9

    可以看到输出内容虽然没有变,但是第一次$var是内在utf8的,而第二次内在格式则不是了。

    求长度的结果是第一个三个字符,正确,第二次九个字符,说明内存格式占了9个字符(或者叫octet?搞不懂perl的名词了),编码为utf-8。

    这就会带来问题,导致regexp匹配不了。

    事实上,我遇到的问题并不是通过IPC读来的字符串,而是直接opendir后由readdir得到的中文文件名。这样得到的也像第二次的$var一样,输出正确,但内在格式不对,导致脚本异常。

    既然内存格式已经是utf-8编码了,那解决方案自然就是把9个字符变回三个,这是一个解码的过程。对perl不是很熟,但找了一下,还是找到了答案。只消加入一句即可:

    $var = decode('utf8', $var);

     

  • 在activeX对象中判定所在网页

    Posted on 四月 22nd, 2008 admin No comments

    一个很原始的需求是:做了一个activex对象,只希望它在某些站点中使用。不希望在其它站点中使用。

    或者说,不希望被别的人偷用。或者不希望被广泛使用而造成安全问题。

    比如:在www.foo.com中可以使用,在www.bar.com中不能使用。

    由于只有ie能创建并访问activeX,因此本文只适用于IE。

    要解决这个问题,关键是两点:

    1. 如何在activex对象中判定当前域名或当前所在网页url。
    2. 如何在判定不能使用后,禁止用户使用。

    对于2,应该是简单的,不能使用后,所有的接口都返回E_FAIL即可。当然,这里有更好的策略,还可以通知到用户。

    对于1,我以前一直没有找到办法,虽然办法很简单。无非是实现一下IObjectWithSite,这样IE在创建activex的时候会把site传给创建的activex,这样就容易取得当前url了:

    HRESULT CMyActiveX::SetSite(IN IUnknown *pUnkSite) { CComQIPtr<IServiceProvider> spsp = pUnkSite; pUnkSite->QueryInterface(&m_WebBrowser2); m_WebBrowser2->get_LocationURL(&m_bsUrl); //more.. }

    对于2,通知到用户的办法是,实现IObjectSafety,然后,在GetInterfaceSafetyOptionsSetInterfaceSafetyOptions中,根据当前情况返回E_FAIL就行了。

    以上内容是是研究微软的某软件的一个activex控件在不同网页里的表现不同而发现的。

  • Javascript 终级“解密”

    Posted on 四月 15th, 2008 admin No comments

    解密加上引号,因为并不是真正的解密。

    现在很多网站不让你看js源码,就想办法变形,最后再document.write出来。

    显然不管它怎么变形,最后总要调用document.write,我们直接在document.write的实现处,

    用native调试来下个断点,不就可以读出来了?

    找到document.write函数:

    C:\>syminfo /S E:\symbol C:\WINDOWS\ie7\mshtml.dll | grep ::write 7DDA72FB[+   0] ?writeln@CDocument@@QAGJPAUtagSAFEARRAY@@@Z             public:long __stdcall CDocument::writeln(struct tagSAFEARRAY *) 7DCE0741[+   0] ?write@CDocument@@QAGJPAUtagSAFEARRAY@@@Z               public:long __stdcall CDocument::write(struct tagSAFEARRAY *)

    显然,直接在这两个函数下断点就可以了。

    下完需要读一个VARIANT结构,里面是一个VT_I8的safearray,需要了解safearray的结构,就不赘述了。

     因为还有更好的办法!
    用firebug直接看就是了。原来也不清楚,原来firebug看时,一个javascript段里调用了document.write之后,就会在dom树里紧跟着看到另一个<script></script>的段。所以,直接用firebug翻看就行了。真是简单啊。

    翻看后可以找个工具把代码格式化一下。

    有个软件叫sourceformatx,好像已经有四年没有更新了。找了一下crack的文章,说这个软件破解不好会直接破坏系统,因此没有人破解。由于四年过了,现在已经可以搜到完美破解版,但是不是真的完美呢?要是有一点不完美,系统就要挂了,怕怕。所以先不用了,要用也在vmware里用。

    thank creese@newsmth.