[资源][编辑器]vc中的资源编辑器

09月 18th, 2008 by admin
Posted in VC/MFC | edit | No Comments »

新建Icon资源后,出现一个青色的空的32*32的icon,可以在其上画图,右边的颜色工具条里面有很多颜色供选择,里面有
2个特殊的颜色,一个是青色的,一个是粉红色的,好像是叫什么”屏幕背景颜色”,请问这2中颜色有何区别?????

如果你把青色的都擦出那么图标就变成白色的了。

青色是透明的那么那个粉红色的又是什么

我把整个图标用Inverse Color颜色刷了一下,让后将生成的图标放在桌面上,看起来就是透明的,好像没有什么反转的效果

楼上各位正解,实际上自己可以试一下。

 

Tags: ,

[字符][替换]中间字符如何替换

09月 18th, 2008 by admin
Posted in VC/MFC | edit | No Comments »

我有一个数据表,表中纪录很多,其中有D22401-3YT2(大约有30条纪录),D22102-3YT12(大约有35条纪录),D224032-32YT2(大约也有30条纪录),D22121-5YT3(大约30多条纪录),现在问题是对D22401-3YT2,D22102-3YT12,D224032-32YT2中的YT变换为LY,但是对D22121-5YT3中的YT又不变换。我是用
REPL   ALL   XX   WITH   'D22401-3LY2 '   FOR   TRIM(LL)== 'D22401-3YT2 '这样的语句一个一个来实现的。
有没有一个语句能够同时将YT变换为LY呢?

use   表名
replace   xx   with   strtran(xx, 'YT ', 'LY ')   for   alltrim(xx) <> 'D22121-5YT3 '

update   表名   set   xx=strtran(xx, 'YT ', 'LY ')   where   alltrim(xx) <> 'D22121-5YT3 '

我试了
UPDATE   SS   SET   XX=STRTRAN(LJH, 'YT ', 'LY ')   WHERE     HH= 'DD '   AND   HH <> 'DD-4308YTDB3 '   AND   HH <> 'DD-4308YTDB5 '
但是没有任何用处,
是怎么回事?

UPDATE   SS   SET   XX=STRTRAN(XX, 'YT ', 'LY ')   WHERE     HH= 'DD '   AND   HH <> 'DD-4308YTDB3 '   AND   HH <> 'DD-4308YTDB5 '

哈哈,是我将字段名写错了,是可行的。多谢十三豆先生

Tags: , ,

[MSDN][列举][进程]MSDN中列举进程代码无法运行出结果问题

09月 18th, 2008 by admin
Posted in VC/MFC | edit | No Comments »

我复制了MSDN中列举所有进程的代码,但执行后无法打印出结果,
不知道是怎么回事:
BOOL GetProcessW1::GetProcessList(){
HANDLE        hProcessSnap = NULL;
    BOOL          bRet      = FALSE;
    PROCESSENTRY32 pe32      = {0};

    //  Take a snapshot of all processes in the system.

    hProcessSnap = CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS, 0);

    if (hProcessSnap == INVALID_HANDLE_VALUE)
        return (FALSE);

    //  Fill in the size of the structure before using it.

    pe32.dwSize = sizeof(PROCESSENTRY32);

    //  Walk the snapshot of the processes, and for each process,
    //  display information.

    if (Process32First(hProcessSnap, &pe32))
    {
        DWORD        dwPriorityClass;
        BOOL          bGotModule = FALSE;
        MODULEENTRY32 me32      = {0};

        do
        {
            bGotModule = GetProcessModule(pe32.th32ProcessID,
                pe32.th32ModuleID, &me32, sizeof(MODULEENTRY32));

            if (bGotModule)
            {
                HANDLE hProcess;

                // Get the actual priority class.
                hProcess = OpenProcess (PROCESS_ALL_ACCESS,
                    FALSE, pe32.th32ProcessID);
                dwPriorityClass = GetPriorityClass (hProcess);
                CloseHandle (hProcess);

                // Print the process's information.
                printf( "
Priority Class Base %d
",
                    pe32.pcPriClassBase);
                printf( "PID %d
", pe32.th32ProcessID);
                printf( "Thread Count %d
", pe32.cntThreads);
                printf( "Module Name %s
", me32.szModule);
                printf( "Full Path %s

", me32.szExePath);

//
CString str,strTemp=" ";
str.Format("%d",pe32.pcPriClassBase);
strTemp+=str;
strTemp+="  ;  ";

str.Format("%d",pe32.th32ProcessID);
strTemp+=str;
strTemp+="  ;  ";

str.Format("%d",pe32.cntThreads);
strTemp+=str;
strTemp+="  ;  ";

str.Format("%s",me32.szModule);
strTemp+=str;
strTemp+="  ;  ";

str.Format("%s",me32.szExePath);
strTemp+=str;
strTemp+="  ;  ";

pMainView->m_ProcessList.AddString(strTemp);

pMainView->UpdateData(FALSE);

            }
        }
        while (Process32Next(hProcessSnap, &pe32));
        bRet = TRUE;
    }
    else
        bRet = FALSE;    // could not walk the list of processes

    // Do not forget to clean up the snapshot object.

    CloseHandle (hProcessSnap);
    return (bRet);

}

BOOL GetProcessModule (DWORD dwPID, DWORD dwModuleID,
    LPMODULEENTRY32 lpMe32, DWORD cbMe32)
{
    BOOL          bRet        = FALSE;
    BOOL          bFound      = FALSE;
    HANDLE        hModuleSnap = NULL;
    MODULEENTRY32 me32        = {0};

    // Take a snapshot of all modules in the specified process.

    hModuleSnap = CreateToolhelp32Snapshot(TH32CS_SNAPMODULE, dwPID);
    if (hModuleSnap == INVALID_HANDLE_VALUE)
        return (FALSE);

    // Fill the size of the structure before using it.

    me32.dwSize = sizeof(MODULEENTRY32);

    // Walk the module list of the process, and find the module of
    // interest. Then copy the information to the buffer pointed
    // to by lpMe32 so that it can be returned to the caller.

    if (Module32First(hModuleSnap, &me32))
    {
        do
        {
            if (me32.th32ModuleID == dwModuleID)
            {
                CopyMemory (lpMe32, &me32, cbMe32);
                bFound = TRUE;
            }
        }
        while (!bFound && Module32Next(hModuleSnap, &me32));

        bRet = bFound;  // if this sets bRet to FALSE, dwModuleID
                        // no longer exists in specified process
    }
    else
        bRet = FALSE;          // could not walk module list

    // Do not forget to clean up the snapshot object.

    CloseHandle (hModuleSnap);

    return (bRet);
}

编译之后有没有出错啊??
代码怎么可以全部复制呢??  你得修改下 适合自己的工程啊  你看看里面的 CString  需要的是 mfc支持的    printf  是控制台的 你建立工程的时候 选择对了没有??必须的头文件包含了没有??

引用 2 楼 rollrock1987 的回复:
编译之后有没有出错啊??
代码怎么可以全部复制呢??⠠你得修改下 适合自己的工程啊⠦nbsp; 你看看里面的 CString⠠需要的是 mfc支持的⠠⠠printf⠠是控制台的 你建立工程的时候 选择对了没有??必须的头文件包含了没有??

编译是没有问题的,问题也不是出在这里。问题是程序根本没有进入到打印那段语句块里面,也就是说
if (bGotModule) 中的bGotModule始终是为FALSE的,含CString那一段是我自己加入的

me32.dwSize = sizeof(MODULEENTRY32);

引用 4 楼 jacklzw88 的回复:
me32.dwSize = sizeof(MODULEENTRY32);

??,程序中有这一句呀

单步调试下,看到什么地方运行不下去了?

引用 6 楼 yjgx007 的回复:
单步调试下,看到什么地方运行不下去了?

运行得下去,就是运行GetProcessModule返回FALSE,不知道怎么回事,帮忙调试一下,谢谢

经过试验得出,如果不判断dwModuleID,则可以得到信息,在我的机器上me32.th32ModuleID 一直为1,而传入的dwModuleID为0
//  do
        {
          // if (me32.th32ModuleID == dwModuleID)
            {
                CopyMemory (lpMe32, &me32, cbMe32);
                bFound = TRUE;
            }
        }
      // while (!bFound && Module32Next(hModuleSnap, &me32));

//以前写的,模拟任务管理器的
HANDLE snapshot;
snapshot=::CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
PROCESSENTRY32 processliststr[50];
for(int j=0;j <50;j++)
processliststr[j].dwSize=sizeof(PROCESSENTRY32);
BOOL return_value;
int i=0;
        int m;
return_value=::Process32First(snapshot,&processliststr[i]);
m_showlist.DeleteAllItems();

CString str;

while(return_value)
{
      m=m_showlist.InsertItem(i,(LPTSTR)processliststr[i].szExeFile);
 
  str.Format("%d",processliststr[i].cntThreads);
  m_showlist.SetItemText(m,1,str);
       
  str.Format("%d",processliststr[i].th32ProcessID); 
  m_showlist.SetItemText(m,2,str);
     
  str.Format("%d",processliststr[i].pcPriClassBase);
  m_showlist.SetItemText(m,3,str);
         

  m_ProcessIndex[i]=processliststr[i].th32ProcessID;
  i++;
  return_value=::Process32Next(snapshot,&processliststr[i]);  
   
}

引用 7 楼 RedskyDeng 的回复:
引用 6 楼 yjgx007 的回复:
单步调试下,看到什么地方运行不下去了?

运行得下去,就是运行GetProcessModule返回FALSE,不知道怎么回事,帮忙调试一下,谢谢


你自已调试下,在GetProcessModule里面step into, 看到哪里不执行返回FALSE?

引用 8 楼 cwc270 的回复:
经过试验得出,如果不判断dwModuleID,则可以得到信息,在我的机器上me32.th32ModuleID 一直为1,而传入的dwModuleID为0
//⠠do
{
// if (me32.th32ModuleID == dwModuleID)
{
CopyMemory (lpMe32, &me32, cbMe32);
bFound = TRUE;
}
}
// while (!bFound && Module32Next(hModuleSnap, &me32));

的确,请问是怎么回事,我把这个判断去掉就OK了,MSDN中的这个判断是什么意思?

me32.dwSize = sizeof(MODULEENTRY32);

你自己再仔细看看。

引用 12 楼 jacklzw88 的回复:
me32.dwSize = sizeof(MODULEENTRY32);

你自己再仔细看看。


没搞懂,请指点

th32ModuleID
Module identifier of the process. The contents of this member has meaning only to the tool help functions. It is not a handle, nor is it usable by functions other than the ToolHelp functions.

th32ModuleID
Module identifier in the context of the owning process. The contents of this member has meaning only to the tool help functions. It is not a handle, nor is it usable by functions other than the ToolHelp functions.

看下这两段英文就明白了…仅仅是对函数调用产生影响,用于模块比较是错误的…

引用 14 楼 gavin1203 的回复:
th32ModuleID
Module identifier of the process. The contents of this member has meaning only to the tool help functions. It is not a handle, nor is it usable by functions other than the ToolHelp functions.

th32ModuleID
Module identifier in the context of the owning process. The contents of this member has meaning only to the tool help functions. It is not a handle, nor is it usable by func…


是呀,你的这个英文文档哪里面的,我的代码可是在MSDN中的,不是我自己写的,我搞不大明白了

调整权集,将运行级上调到最高

Tags: , , ,

[顶级][复杂][richedit]顶级复杂的 richedit 乱码问题。。。吐血狂晕~~

09月 18th, 2008 by admin
Posted in VC/MFC | edit | No Comments »

不知道大家用过Nero 刻录软件没有,我正在改里面的一个终极郁闷的问题,用尽了一切手段和方法也搞不定!
问题如下:

编辑菜单的时候 ,输入框采用richedit,创建方法如下:

bool cr = RichEditCtrl::Create(0, WS_CHILD |  (m_singleLine ? 0 : (ES_WANTRETURN | ES_MULTILINE)), Rect(-1, -1, -1, -1), parent, 1);
    if (cr) {
      SetEventMask(ENM_CHANGE | ENM_KEYEVENTS | ENM_SELCHANGE);
      SetTextMode(TM_PLAINTEXT);
      Subclass();
      return true;
    }
调入微软全拼,输入没有任何乱码问题,但是全拼输入时,输入法输入框跑到了屏幕最顶端。而且不能够使用输入法的选择词语功能。
我们这边的一位高手,找了一个参数ES_SELFIME解决了这个问题如下,

bool cr = RichEditCtrl::Create(0, WS_CHILD |ES_SELFIME|  (m_singleLine ? 0 : (ES_WANTRETURN | ES_MULTILINE)), Rect(-1, -1, -1, -1), parent, 1);
    if (cr) {
      SetEventMask(ENM_CHANGE | ENM_KEYEVENTS | ENM_SELCHANGE);
      SetTextMode(TM_PLAINTEXT);
      Subclass();
      return true;
    }
结果输入法位置一切正常了,但是输入汉字的时候会出现乱码!!! 然后我就开始了慢慢查找乱码的旅途。 结果发现
// get required length (use user-specified CR translation setting)
  GETTEXTLENGTHEX gtl;
  gtl.codepage = 1200;
  gtl.flags = GTL_NUMBYTES | ((flags & GT_USECRLF) ? GTL_USECRLF : GTL_DEFAULT);
  int size = (int)SendMessage(EM_GETTEXTLENGTHEX, (WPARAM)&gtl, 0);
  if (size <= 0)
    return size;

  wchar_t* p = new wchar_t[size];

  // get text
  GETTEXTEX gt;
  gt.cb = size * sizeof(wchar_t);
  gt.codepage = 1200;
  gt.flags = flags;
  gt.lpDefaultChar = 0;
  gt.lpUsedDefChar = 0;
  int rc = (int)SendMessage(EM_GETTEXTEX, (WPARAM)&gt, (LPARAM)p);
  buffer = String(p, rc);
  delete[] p;
  获取到的输入就是乱码
  本系统是 纯英文的vista 操作系统,软件在2005中编译,编译参数加了UNICODE
  也采用了 richedit2.0 unicode版本了
  LoadLibrary(L"RICHED32.DLL");
// LoadLibrary(L"RICHED20.DLL");
请问大家能不能帮我分析一下,我真是不尽感激。。

据说,微软输入法,输出的unicode,而全拼或智能ABC输出都是ANSI,自己转换吧

引用 2 楼 w_anthony 的回复:
据说,微软输入法,输出的unicode,而全拼或智能ABC输出都是ANSI,自己转换吧

无视我的话吧,我自己建了一个unicode工程,发现RichEdit2可以用全拼输入。
资源里面相关行就是这样简单的一句
    CONTROL        "",IDC_RICHEDIT21,"RichEdit20A",ES_AUTOHSCROLL | WS_BORDER | WS_TABSTOP,7,7,200,101

不太明白,加上ES_SELFIME 后,所有输入发都有乱码了,不是所有都是乱码,有些字乱码?有些字不是乱码?

http://msdn2.microsoft.com/en-us/library/bb774250(VS.85).aspx
具体设置成什么参数?? IMF_DUALFONT??

Tags: , , ,

[应用程序][求救]VC如何呼出应用程序呀求救

09月 18th, 2008 by admin
Posted in VC/MFC | edit | No Comments »

当前运行一个程序,欲呼出的程序为非当前窗口,自己定义一个热键如F11,按F11后使自己的程序在当前窗口显示
请前辈们不吝赐教。。。。。

求教。。

注册系统热键?
RegisterHotKey
然后 映射 ON_MESSAGE(WM_HOTKEY,  OnHotKey)
在 OnHotKey 函数中激活 自己的程序

装一个钩子,在钩子里判断窗口,然后SetWindowPos()

小弟新手,不知该从何入手,还望给出部分代码,不胜感激

另外,热键已经定义好了,用RegisterHotKey,只是不清楚如何呼出该程序

头文件定义
afx_msg LRESULT OnHotKey(WPARAM wparam,LPARAM lparam);
在程序初始话中定义 RegisterHotKey (this->GetSafeHwnd(),1,MOD_CONTROL,'B');//Ctrl+B 呼出
我是加在 OnInitDialog 里面
消息映射
BEGIN_MESSAGE_MAP(CdlgDlg, CDialog)
ON_WM_SYSCOMMAND()
ON_WM_PAINT()
ON_WM_QUERYDRAGICON()
//}}AFX_MSG_MAP

ON_MESSAGE(WM_HOTKEY,  OnHotKey)

END_MESSAGE_MAP()
函数
LRESULT  CdlgDlg::OnHotKey(WPARAM wparam,LPARAM lparam)
{
ShowWindow(SW_RESTORE); 
SetForegroundWindow(); 

return 0L;

}
2005下通过 ,你要是6.0 好像函数返回void的?

Tags: , ,

[DrawText][改变][输出]DrawText如何改变输出的字体

09月 18th, 2008 by admin
Posted in VC/MFC | edit | No Comments »

原码是

hdc = BeginPaint(hWnd, &ps);
RECT rt;
GetClientRect(hWnd, &rt);

DrawText(hdc, szHello, strlen(szHello), &rt, DT_LEFT);
EndPaint(hWnd, &ps);

是输出SZHELLO,想改变这个输出的字体,应该怎么做呢??

搞定,结帖给分!

Tags: , , ,

[使用][DirectDraw][显示]如何使用DirectDraw 显示图象序列

09月 17th, 2008 by admin
Posted in VC/MFC | edit | No Comments »

我正做一个图象序列显示程序,图象序列是352*288分辨率的,是用directshow捕获的,用StretchDIBits   定时显示图象序列,但是如果要在上面添加文字什么的,闪烁感比较强,所以想采用DirectDraw来实现,我看了CSDN上老的帖子,http://topic.csdn.net/t/20020522/17/744153.html   上面xzhangjie(飞天狐狸)发了一个类
#include       "DDraw.h "          
    class       CDDraw              
    {      
    public:      
    void       CleanUp();      
    void       DrawDIB(BITMAPINFOHEADER*       pBI,char*       pData,RECT*rt);      
    BOOL       Init(HWND       hWnd,int       nWidth,int       nHeight);      
    CDDraw();      
    virtual       ~CDDraw();      
       
    private:      
    HWND       m_hDrawWnd;      
    LPDIRECTDRAW       lpDD;       //       DirectDraw       对象      
    LPDIRECTDRAWSURFACE       lpDDSPrimary;       //       DirectDraw       主页面      
    LPDIRECTDRAWSURFACE       lpBackdds;      
    LPDIRECTDRAWCLIPPER       lpClipperBack;      
    };      
       
       
    CDDraw::CDDraw()      
    {      
    lpDD=NULL;      
    lpDDSPrimary=NULL;      
    lpBackdds=NULL;      
    lpClipperBack=NULL;      
    }      
       
    CDDraw::~CDDraw()      
    {      
    if(lpDD!=NULL)CleanUp();      
    }      
       
    BOOL       CDDraw::Init(HWND       hWnd,int       nWidth,int       nHeight)      
    {      
    if(hWnd==NULL)       return       FALSE;      
       
    m_hDrawWnd=hWnd;      
       
    if(DirectDrawCreate(NULL,&lpDD,NULL)!=DD_OK)return       FALSE;      
       
    lpDD-> SetCooperativeLevel(hWnd,       DDSCL_NORMAL);      
       
    DDSURFACEDESC       ddsd;      
    ddsd.dwSize       =       sizeof(       ddsd       );       //结构的大小      
    ddsd.dwFlags       =       DDSD_CAPS;       //指定DDSURFACEDESC结构的ddsCaps成员为可用      
    ddsd.ddsCaps.dwCaps       =       DDSCAPS_PRIMARYSURFACE;       //指定要创建的是主页面      
       
    //创建主页面对象      
    if       (       lpDD-> CreateSurface(       &ddsd,       &lpDDSPrimary,       NULL       )       !=       DD_OK)       return       FALSE;      
       
    if(lpDD-> CreateClipper(NULL,&lpClipperBack,NULL)!=DD_OK)       return       FALSE;      
       
    lpClipperBack-> SetHWnd(0,hWnd);      
       
    lpDDSPrimary-> SetClipper(lpClipperBack);      
       
    lpClipperBack-> Release();      
    lpClipperBack=NULL;      
       
    ddsd.dwFlags       =       DDSD_CAPS       |       DDSD_HEIGHT       |       DDSD_WIDTH;          
    ddsd.ddsCaps.dwCaps       =       DDSCAPS_OFFSCREENPLAIN;          
    ddsd.dwHeight       =       nHeight;          
    ddsd.dwWidth       =       nWidth;          
    if(lpDD-> CreateSurface(&ddsd,       &lpBackdds,       NULL)!=DD_OK)       return       FALSE;      
       
    return       TRUE;      
    }      
       
    void       CDDraw::DrawDIB(BITMAPINFOHEADER       *pBI,       char       *pData,       RECT       *rt)      
    {      
    RECT       srt;      
    srt.left=0;      
    srt.top=0;      
    srt.right=pBI-> biWidth;      
    srt.bottom=pBI-> biHeight;      
       
    HDC       hDC;      
    lpBackdds-> GetDC(&hDC);      
       
    SetDIBitsToDevice(      
    hDC,      
    0,      
    0,      
    pBI-> biWidth,                                                   //       source       rectangle       width      
    pBI-> biHeight,                                               //       source       rectangle       height      
    0,                                                                       //       x-coord       of       source       lower-left       corner      
    0,                                       //       y-coord       of       source       lower-left       corner      
    0,                                                                                               //       first       scan       line       in       array      
    pBI-> biHeight,                                           //       number       of       scan       lines      
    pData,                       //       array       of       DIB       bits      
    (const       struct       tagBITMAPINFO*)pBI,       //       bitmap       information      
    DIB_RGB_COLORS                                           //       RGB       or       palette       indexes      
    );      
       
    lpBackdds-> ReleaseDC(hDC);      
       
    lpDDSPrimary-> Blt(rt,lpBackdds,&srt,0,NULL);      
    }      
       
    void       CDDraw::CleanUp()      
    {      
    if(lpDD!=NULL)      
    {      
    if(lpClipperBack!=NULL)      
    {      
    lpClipperBack-> Release();      
    lpClipperBack=NULL;      
    }      
       
    if(lpDDSPrimary!=NULL)      
    {      
    lpDDSPrimary-> Release();      
    lpDDSPrimary=NULL;      
    }      
       
    if(lpBackdds!=NULL)      
    {      
    lpBackdds-> Release();      
    lpBackdds=NULL;      
    }      
       
    lpDD-> Release();      
    lpDD=NULL;      
    }      
    }      
但是无法显示图象序列,序列已从32位转成24位RGB    
 
哪位大哥能告诉我原因啊?谢谢了      

我的邮箱:jiaqicx@163.com

大家帮帮忙啊   谢谢了

自己顶

Tags: , , ,

[强制][结束][进程]如何强制结束一个进程

09月 17th, 2008 by admin
Posted in VC/MFC | edit | No Comments »

在多线程调试的时候(XP操作系统下),经常会出现死机的现象,不得不进行重启才能解决。
后来找到一个名为antifreeze的国外软件,在几乎死机的时候还可以调用该程序,将环境进程结束掉。
另外发现,VC环境下,在设置断点断下的时候,这个时候即使用任务管理器无法将此刻调试的进程结束掉,这是为什么?

我的问题是,在系统几乎死机的时候,如果让自己的程序还能获取CPU分配的时间,将我需要结束的进程结束掉?谢谢

普通方法都试了,不行,因为多线程死机的时候,几乎没有程序可以响应了。

有些时候是死在内核模式下,这时候进程管理器通常无法结束。或许有些情况可以利用驱动程序在内核模式下结束进程。

引用 1 楼 jameshooo 的回复:
一个偏方:在你的程序中启动一个console窗口,然后执行调试去,如果出现任何问题,console窗口还是能响应的,直接关闭console窗口就能退出你的进程

能具体给出实例吗?谢谢!

LS的方法不错,学习了!

引用 1 楼 jameshooo 的回复:
一个偏方:在你的程序中启动一个console窗口,然后执行调试去,如果出现任何问题,console窗口还是能响应的,直接关闭console窗口就能退出你的进程

mark

AllocConsole/FreeConsole即可

多线程调试的时候,确实是会经常假死,但是可以用以下方法解决(本人经验。^^)
打开记事本,写一些东西,别保存,当调试发生假死的时候。可以按ctrl+alt+del选择注销,系统会把VC给结束掉,之后会问时候保存文件,点取消即可恢复正常。从而避免重新启动机器。

以前编译过一个GINA(代码不是我的)。就是对付VC调试造成系统假死的。同样有效。

———————
我的问题是,在系统几乎死机的时候,如果让自己的程序还能获取CPU分配的时间,将我需要结束的进程结束掉?谢谢

普通方法都试了,不行,因为多线程死机的时候,几乎没有程序可以响应了。
———————-
你说的这些话是不对的,首先假死的时候,系统还可以快速响应热键!例如ctrl+alt+del,antifreeze也是如此。其次,发生假死的时候CPU空闲接近100%!不信你就按下热键,选择任务管理器。第三,antifreeze接收到热键,会切换到另外一个桌面,并挂起所有的线程,结束进程应该是TerminateProcess,我在调试器里发现它被调用。第四,要结束的进程不是被调试进程,而是VC。

关注 接分

Tags: , , ,

[动态][创建][ActiveX]动态创建ActiveX的问题

09月 17th, 2008 by admin
Posted in VC/MFC | edit | No Comments »

ATL下面想动态创建一个ActiveX,主要代码如下:
HRESULT hr;
RECT  rc; 
GetClientRect(&rc);

LPOLESTR pstrbrowserid; 
StringFromCLSID(IID_ICortona, &pstrbrowserid); 
CComBSTR bstrbrowser(pstrbrowserid); 
CoTaskMemFree(pstrbrowserid);

HWND hwnd;

hwnd = m_axNestedControl.Create(m_hWnd, rc, 0, WS_CHILD | WS_VISIBLE); 
hr = m_axNestedControl.CreateControlEx((LPCOLESTR)bstrbrowser, NULL, NULL, reinterpret_cast <IUnknown**>(&m_pICortona)); 

调试到这里来时hr显示“没有注册类别”,可我明明已经注册了这个ActiveX啊,GUID也没错,会是什么问题呢?

我把StringFromCLSID换成了StringFromIID,结果还是一样,hr显示“没有注册类别”,还有别的什么问题吗?

已经说了,要用CLSID,不能用IID

Tags: , , ,

[游戏][源码][突破]如何看游戏源码才能更快突破

09月 17th, 2008 by admin
Posted in VC/MFC | edit | No Comments »

公司给了个游戏项目的源码,但感觉好多Global Macrot,Global Variable, Global Function 。我应该怎样突破

一个一个来
神挡杀神佛挡杀佛

看结构先,一般都会有该函数或模块的简要解释
大体结构流程先看,不用细看每个函数,知道是干嘛用的就行(如果条件允许,先让经理或组长把整个流畅串一遍)
结构框架了解了之后,再细看你需要的部分,
当然你也可以直接看相关部分,我个人觉得有个结构性的认识对局部理解有很大帮助

全局宏很多是调试用的,而全局变量和函数在成熟的项目上是要尽量避免的,所以应该不多才对,先不用管,
全局意味着多处用到,你刚开始肯定不知道在哪用到,等用到的时候跟踪下就是了

分模块熟悉,比如说,玩家、怪物、地图场景、网络通讯、数据库

引用 2 楼 hucailai 的回复:
一个一个来
神挡杀神佛挡杀佛

Tags: , , ,