??xml version="1.0" encoding="utf-8" standalone="yes"?>久久久这里有精品,亚洲色欲久久久综合网,国产精品久久久久影视不卡http://www.shnenglu.com/Robertxiao/category/5519.htmlzh-cnTue, 06 Nov 2012 11:05:43 GMTTue, 06 Nov 2012 11:05:43 GMT60打造自qDEBUG_NEWhttp://www.shnenglu.com/Robertxiao/archive/2012/11/05/194547.htmlRobertxiaoRobertxiaoMon, 05 Nov 2012 03:53:00 GMThttp://www.shnenglu.com/Robertxiao/archive/2012/11/05/194547.htmlhttp://www.shnenglu.com/Robertxiao/comments/194547.htmlhttp://www.shnenglu.com/Robertxiao/archive/2012/11/05/194547.html#Feedback0http://www.shnenglu.com/Robertxiao/comments/commentRss/194547.htmlhttp://www.shnenglu.com/Robertxiao/services/trackbacks/194547.html阅读全文

Robertxiao 2012-11-05 11:53 发表评论
]]>
操控NT式驱动小工具的源?/title><link>http://www.shnenglu.com/Robertxiao/archive/2010/04/21/113159.html</link><dc:creator>Robertxiao</dc:creator><author>Robertxiao</author><pubDate>Wed, 21 Apr 2010 12:08:00 GMT</pubDate><guid>http://www.shnenglu.com/Robertxiao/archive/2010/04/21/113159.html</guid><wfw:comment>http://www.shnenglu.com/Robertxiao/comments/113159.html</wfw:comment><comments>http://www.shnenglu.com/Robertxiao/archive/2010/04/21/113159.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/Robertxiao/comments/commentRss/113159.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/Robertxiao/services/trackbacks/113159.html</trackback:ping><description><![CDATA[     摘要: 操控NT式驱动小工具的源?nbsp; <a href='http://www.shnenglu.com/Robertxiao/archive/2010/04/21/113159.html'>阅读全文</a><img src ="http://www.shnenglu.com/Robertxiao/aggbug/113159.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/Robertxiao/" target="_blank">Robertxiao</a> 2010-04-21 20:08 <a href="http://www.shnenglu.com/Robertxiao/archive/2010/04/21/113159.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>三种操作文g存储Ҏ(gu)的比?/title><link>http://www.shnenglu.com/Robertxiao/archive/2009/07/22/90806.html</link><dc:creator>Robertxiao</dc:creator><author>Robertxiao</author><pubDate>Wed, 22 Jul 2009 02:51:00 GMT</pubDate><guid>http://www.shnenglu.com/Robertxiao/archive/2009/07/22/90806.html</guid><wfw:comment>http://www.shnenglu.com/Robertxiao/comments/90806.html</wfw:comment><comments>http://www.shnenglu.com/Robertxiao/archive/2009/07/22/90806.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.shnenglu.com/Robertxiao/comments/commentRss/90806.html</wfw:commentRss><trackback:ping>http://www.shnenglu.com/Robertxiao/services/trackbacks/90806.html</trackback:ping><description><![CDATA[     摘要:            q段旉Q我正在负责升公司中一个品的几个版本。这几个pȝ的基本框枉相同Q架构都是以W一个系lؓ(f)模型Q只是后l的产品扩展?jin)许多功能。ȝ说来q几个品逻辑也不是很复杂Q但因几易开发员Q而且没有标准和缺乏设计,所以系l的可维护性较低?  &n...  <a href='http://www.shnenglu.com/Robertxiao/archive/2009/07/22/90806.html'>阅读全文</a><img src ="http://www.shnenglu.com/Robertxiao/aggbug/90806.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.shnenglu.com/Robertxiao/" target="_blank">Robertxiao</a> 2009-07-22 10:51 <a href="http://www.shnenglu.com/Robertxiao/archive/2009/07/22/90806.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>Zvc的程序加载多个资源文件的方式 http://www.shnenglu.com/Robertxiao/archive/2009/04/20/80553.htmlRobertxiaoRobertxiaoMon, 20 Apr 2009 10:20:00 GMThttp://www.shnenglu.com/Robertxiao/archive/2009/04/20/80553.htmlhttp://www.shnenglu.com/Robertxiao/comments/80553.htmlhttp://www.shnenglu.com/Robertxiao/archive/2009/04/20/80553.html#Feedback0http://www.shnenglu.com/Robertxiao/comments/commentRss/80553.htmlhttp://www.shnenglu.com/Robertxiao/services/trackbacks/80553.html      Z(jin)在程序中更合理地l织E序的结构,以便日后的维护。在资源斚wQ如果同时存在多语言的版本,而且在各个版本中有些囄不同、有些相同。如何组l好q些囄资源Q我认ؓ(f)有如下的3U方式?br>      1Q把E序中的所有图片都随着一个资源DLL发布?br>      2Q把E序中的所有图片都攑֜可执行文件的一个相对目录中Q程序运行时到指定的目录d载指定名U的囄?br>      3Q把在各个版本相同的囄攑֜一个公qDLL中,把彼此不同的囄攑֜各自的DLL中?br>

         在这里介l下W三U方式,也就是如何让一个exeE序加蝲多个DLL资源Qƈ在这些DLL中找相应的资源的问题Q?br>       m_hResDll = ::LoadLibrary(_T("rc1.dll"));
       m_hResDll2 = ::LoadLibrary(_T("rc2.dll"));

       m_pExeModule = new CDynLinkLibrary(AfxGetInstanceHandle(), AfxGetResourceHandle());       
       AfxSetResourceHandle(m_hResDll);

       m_pExeModule2 = new CDynLinkLibrary(AfxGetInstanceHandle(), AfxGetResourceHandle());
       AfxSetResourceHandle(m_hResDll2);

         在这里值得注意的是Q要调用
         m_pExeModule = new CDynLinkLibrary(AfxGetInstanceHandle(), AfxGetResourceHandle());
q个语句Q如果没有这个语句,那么q个E序的原有资源模块将视ؓ(f)释放。也׃?x)到原有的资源模块中L索?br>



Robertxiao 2009-04-20 18:20 发表评论
]]>
develop cusom controlhttp://www.shnenglu.com/Robertxiao/archive/2008/09/27/62897.htmlRobertxiaoRobertxiaoSat, 27 Sep 2008 07:42:00 GMThttp://www.shnenglu.com/Robertxiao/archive/2008/09/27/62897.htmlhttp://www.shnenglu.com/Robertxiao/comments/62897.htmlhttp://www.shnenglu.com/Robertxiao/archive/2008/09/27/62897.html#Feedback0http://www.shnenglu.com/Robertxiao/comments/commentRss/62897.htmlhttp://www.shnenglu.com/Robertxiao/services/trackbacks/62897.html        不久前,因ؓ(f)需要我必须开发一个?/span>MFC?/span>CWndcd的控件。这个控件将?x)放在一?/span>DLL中来让用者来调用Q这样就可以在每ơ的复用时不要停留在扚w的拷文g的过E。我不是说批量拷文g到新的工E中的做法不好,但是l过几个目的批量拷文g的做法很有可能会(x)让原来简单的几个文g变成一大堆耦合很强的文Ӟq将l再ơ复用带来不ѝ但是文件直接包含在使用者处也会(x)带来些好处,如调试要来得方便一些,要修改一些特性也是很Ҏ(gu)。所以有做事是一个决{的q程Q我认ؓ(f)不假。如果其中没有决{,那只能说明一件事Q我们忽略了(jin)某些东西。这往往也是很危险的?/span>

 

        在这个开发的q程中,我自认ؓ(f)Ҏ(gu)个过E是清晰的,明了(jin)的。但是在开发的q程中却因一个细节问题而迫使我׃(jin)整整一个上午的旉来调试,最后得以发现这个问题。这里我q单地回顾q个开发过E?/span>

   1Q利用向g?/span>MFC Regular DLL 框架?/span>

   2Q在app文g中加入一个导出的哑函敎ͼ是什么事也不做的函数Q来让这?/span>DLL支持隐式的加?/span>.

                   ?/span> extern “C” __declspec(dllimport) DummyExport() {}

   3: d一个自CWndz的类Q就?/span>MyCWnd好了(jin)?/span>

   4Qؓ(f)q个MyApp映射消息。如映射一?/span>OnLButtonDown。ƈ在这个消息中向父控g?br>               ?gu)q消息Q当然实际项目中可不?x)是q样单,q里只是让控件的框架
               先能跑v来证明与外界的消息是畅通的Q?/span>

              GetParent()->SendMessage(WM_COMMAND, GetCtrlID(), GetSafeHwnd());

   5: 自定义一个消?/span>   #define WM_MYWNDLAUGH (WM_USER + 106)q完成相应的映射?/span>

   6Qؓ(f)?jin)注册这自己的这个窗体类别,我们必须有一个静(rn)态的注册函数Q?br>               以便?/span>CWinApp::InitInstance时注册窗体类?/span>

                q里是关键?br>               

 1 WNDCLASS wc;
 2 wc.style = CS_GLOBALCLASS ;//q里曾让我花?jin)数时来找q个bug.
 3 wc.lpfnWndProc = myFunc;
 4 
 5 
 6 LRESULT CALLBACK AFX_EXPORT myFunc(HWND hwnd, UINT message, WPARAM wparam, LPARAM lparam)
 7 {
 8     AFX_MANAGE_STATE(AfxGetStaticModuleState());
 9     CWnd *pWnd;
10     pWnd =CWnd::FromHandlePermanent(hWnd);
11     if(pWnd == NULL)
12     { pWnd = new MyWnd(); pWnd->attach(hwnd); }
13     return AfxCallWndProc(pWnd, hWnd, message, wParam, lParam);
14 }
15 


      
   7: ?/span>CWinApp::InitInstance中调用注册函数?/span>

   8: 在用者界面中d自定义控Ӟ控g的类别就是上面的wc.lpszClassName对应的名U?/span>

   9: 在用者类中映子控g消息

   10:在早期就调用上述的哑函数?/span>

   11:向自定义控g发送消息。这样就搭v?jin)一个自定义控g的框Ӟ在上面的q些步聚中就?br>               W6步要l心(j)。余下的是加特性的工作?jin)。上q参考了(jin)MFC技术内q等有关资料?/span>

 



Robertxiao 2008-09-27 15:42 发表评论
]]>
q程初探?lt;?gt;http://www.shnenglu.com/Robertxiao/archive/2008/06/17/53766.htmlRobertxiaoRobertxiaoTue, 17 Jun 2008 14:26:00 GMThttp://www.shnenglu.com/Robertxiao/archive/2008/06/17/53766.htmlhttp://www.shnenglu.com/Robertxiao/comments/53766.htmlhttp://www.shnenglu.com/Robertxiao/archive/2008/06/17/53766.html#Feedback0http://www.shnenglu.com/Robertxiao/comments/commentRss/53766.htmlhttp://www.shnenglu.com/Robertxiao/services/trackbacks/53766.html       q一D|_(d)我的?j)情开始低落了(jin)。对自已不象以前那样有信?j),L觉自q道的太少Q跟别h比v来我gL差了(jin)那么一些。可是,我总认为我是一个努力勤奋的人,我在不断地努力钻研,学习(fn)。从标准的C++、windowsSDKQwindows的内核再到COM、ATLq些知识Q我L象一个饥饿的Zhq去Q在q些代码的片断中我能扑ֈ我前q的脚印。可是在现实中我却还了(jin)一个给我表演的舞台Q我难抑自我的失落?br>
      q一D|_(d)q州q里的雨水特别的多,比广州春天的雨水q要多。每天都有几场大雨,路上的行ZL些被淋得n湉K,我很向往?#8220;自然”地雨中洗Cg番,享受q自然的赋予Q冲Mw的埃。心(j)里在惌么这个老天变成?jin)一个爱哭的仙?jin),抑或是(zhn)泣于我国的自然灾実뀂神仙也是有感情的,q也难怪了(jin)Q他q也是情不自Ş?jin)?br>
      q程是程序在一个数据集合上的一ơ活动。我们的E序是执行这个活动的逻辑实现体,我们可以在窗口中同时启动多个我们的这个程序(当然q要得到E序的允许,通常情况下是允许的,如果要做C允许可以通过比如互斥器等来实玎ͼ(j)。我很想知道我有多少个实例被启动?jin),有时我就是这L(fng)好奇。我试着如下做时我达C(jin)我的目的?br>

#pragma data_seg("Shared")
volatile LONG g_lApplicationInstances = 0
#pragma data_seg()
   #pragma comment(linker,"/Section:Shared,RWS")


int APIENTRY WinMain(HINSTANCE hInstance,
                     HINSTANCE ,
                     LPSTR     lpCmdLine,
                     
int       nCmdShow)
{
    InterlockedExchangeAdd((PLONG)
&g_lApplicationInstances, 1);
//do some work
    InterlockedExchangeAdd((PLONG)&g_lApplicationInstances, -1);

    
return 0;
}



每当q入d敎ͼ我就对这个计数器q行递增一ơ,每次d前我减一。我要的时候我在E序中直接取q个计数器就行了(jin)。这h很好地达C(jin)我的目标。当然把q个数据D|在某个共享的DLL中的也是可以的,q个Z么能够实现还得从PE文g来说。在q里我只要知道这些宏?x)在生成PE文g时会(x)q把q个D|到共享段中去Q这样windows在加载多个时q不?x)对q个数据D进行多份复制就行了(jin)?br>



Robertxiao 2008-06-17 22:26 发表评论
]]>
winsock E序http://www.shnenglu.com/Robertxiao/archive/2008/06/10/52811.htmlRobertxiaoRobertxiaoTue, 10 Jun 2008 15:19:00 GMThttp://www.shnenglu.com/Robertxiao/archive/2008/06/10/52811.htmlhttp://www.shnenglu.com/Robertxiao/comments/52811.htmlhttp://www.shnenglu.com/Robertxiao/archive/2008/06/10/52811.html#Feedback0http://www.shnenglu.com/Robertxiao/comments/commentRss/52811.htmlhttp://www.shnenglu.com/Robertxiao/services/trackbacks/52811.html服务?
#include <stdlib.h>
#include <stdio.h>
#include <WINSOCK2.H>
#include <WS2TCPIP.H>
#include <windows.h>


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

#define DEFAULT_BUFLEN 512
#define DEFAULT_PORT "27015"

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

int  main()
{
 WSADATA wsaData;
 SOCKET listenSocket = INVALID_SOCKET;
 SOCKET clientSocket = INVALID_SOCKET;
 char recvBuf[DEFAULT_BUFLEN];
 int iResult,iSendResult;
 int recvBuflen = DEFAULT_BUFLEN;

 iResult = WSAStartup(MAKEWORD(2,0),&wsaData);
 if(iResult)
 {
  printf("WSASTATUP failed!\n");
  return 1;
 }
 
 listenSocket = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
 if(listenSocket == INVALID_SOCKET)
 {
  printf("socket failed:%ld\n", WSAGetLastError());
  WSACleanup();
  return 1;
 }
 
 
 sockaddr_in saServer;
 saServer.sin_family = AF_INET;
 saServer.sin_addr.s_addr = inet_addr("127.0.0.1");
 saServer.sin_port = htons(5150);

 iResult = bind(listenSocket,(sockaddr *)&saServer, sizeof(saServer));
 if(iResult == SOCKET_ERROR)
 {
  printf("bind failed!");
  closesocket(listenSocket);
  WSACleanup();
  return 1;
 }
 iResult = listen(listenSocket, SOMAXCONN);
 if(iResult == SOCKET_ERROR)
 {
  printf("LISTEN failed!");
  closesocket(listenSocket);
  WSACleanup();
  return 1;
 }
 printf("Wait client connect");
 clientSocket = accept(listenSocket, NULL, NULL);
 if(clientSocket == INVALID_SOCKET)
 {
  printf("accept failed!");
  closesocket(listenSocket);
  WSACleanup();
  return 1;
 }
 closesocket(listenSocket);
 printf("Now wait the data arrive...\n");
 do
 {
  iResult = recv(clientSocket, recvBuf, recvBuflen, 0);
  if(iResult > 0)
  {
   printf("Bytes received:%d\n",iResult);
   iSendResult = send(clientSocket, recvBuf, iResult, 0);
   if(iSendResult == SOCKET_ERROR)
   {
    printf("send failed");
    closesocket(clientSocket);
    WSACleanup();
    return 1;
   }
   else if (iResult == 0)
   {
    printf("Connect closed!");
   }
   else
   {
    printf("recv failed");
    closesocket(clientSocket);
    WSACleanup();
    return 1;
   }
  }
 } while(iResult > 0);

 iResult = shutdown(clientSocket, SD_SEND);
 if(iResult == SOCKET_ERROR)
 {
  printf("shut dowm failed!");
  closesocket(clientSocket);
  WSACleanup();
  return 1;
 }
 closesocket(clientSocket);
 WSACleanup();
 getchar();
 return 0;
}

//客户?br>#include <stdlib.h>
#include <stdio.h>
#include <WINSOCK2.H>
#include <WS2TCPIP.H>
#include <windows.h>

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

 

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

#define DEFAULT_BUFLEN 512
#define DEFAULT_PORT "27015"

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

int main()
{
 WSADATA wsaData;
 SOCKET connectSocket = INVALID_SOCKET;
 char *sendBuf = "This is a test";
 char recvBuf[DEFAULT_BUFLEN];
 int iResult;
 int recvBufLen = DEFAULT_BUFLEN;
//  if(argc != 2)
//  {
//   printf("useage:%s server -name\n",argv[0]);
//   return 1;
//  }
 iResult = WSAStartup(MAKEWORD(2,0),&wsaData);
 if(iResult)
 {
  printf("WSASTATUP FAILED.");
  return 1;
 }
 sockaddr_in addr;
 addr.sin_family = AF_INET;
 addr.sin_port = htons(5150);
 addr.sin_addr.s_addr = inet_addr("127.0.0.1");
 connectSocket =  socket(AF_INET, SOCK_STREAM, IPPROTO_TCP);
 if(connectSocket == INVALID_SOCKET)
 {
  printf("Error at socket!");
  WSACleanup();
  return 1;
 }
 iResult = connect(connectSocket, (sockaddr *)&addr, sizeof(addr));
 if(iResult == SOCKET_ERROR)
 {
  printf("Connect failed!");
  WSACleanup();
  return 1;
 }

 iResult = send(connectSocket, sendBuf, (int)strlen(sendBuf), 0);
 if(iResult == SOCKET_ERROR)
 {
  printf("Send failed");
  closesocket(connectSocket);
  WSACleanup();
  return 1;
 }
 printf("Bytes send.");
 iResult = shutdown(connectSocket, SD_SEND);
 if(iResult == SOCKET_ERROR)
 {
  printf("shut down failed");
  closesocket(connectSocket);
  WSACleanup();
  return 1;
 }
 do
 {
  iResult = recv(connectSocket, recvBuf, recvBufLen, 0);
  if(iResult > 0)
  {
   printf("Bytes received:%d\n",iResult);
  }
  else if(iResult == 0)
  {
   printf("connect closed");
  }
  else
  {
   printf("Recv failed");
  }
 } while(iResult > 0);
 closesocket(connectSocket);
 WSACleanup();
 return 0;
}
注意要加入链接库WS2_32.lib



Robertxiao 2008-06-10 23:19 发表评论
]]>
q程初探?lt;4>http://www.shnenglu.com/Robertxiao/archive/2008/05/02/48633.htmlRobertxiaoRobertxiaoFri, 02 May 2008 06:51:00 GMThttp://www.shnenglu.com/Robertxiao/archive/2008/05/02/48633.htmlhttp://www.shnenglu.com/Robertxiao/comments/48633.htmlhttp://www.shnenglu.com/Robertxiao/archive/2008/05/02/48633.html#Feedback0http://www.shnenglu.com/Robertxiao/comments/commentRss/48633.htmlhttp://www.shnenglu.com/Robertxiao/services/trackbacks/48633.html       
         时下很多介绍人际交往、公关之cȝ书藉。大凡其中都谈到?jin)要因h而异Q了(jin)解对斏V然后才能展开有效的交际方法。是的,比如说有些h喜Ƣ与言之h做朋友,而有些h却喜Ƣ与能言者做朋友。有的h喜欢谈政治,有的人喜Ƣ谈利益。你如果与刚愎自用之与其相?zhn)的观点,我估计?x)闹个不欢而散Q而与虚怀若谷的纳a人则可能?x)视你?f)良友。同一番话l与不同的hQ就产生?jin)截然不同的效果Q所以我们要有因异的交际策略。这也就提出?jin)要我们在想好这个策略之前就要?jin)解一个h。进E之间也?x)是如此的吗Q?br>
       上面说了(jin)q么多的引言Q下面来说一q程的发玎ͼ认识。下面用一D代码示例枚举了(jin)当前pȝ中的q程?
 1#ifndefine _XIAO_TOOLHELP_H_
 2#define _XIAO_TOOLHELP_H_
 3#include <TLHELP32.H>
 4#include <tchar.h>
 5//////////////////////////////////////////////////////////////
 6
 7class CToolHelp
 8{    
 9public:
10    CToolHelp(DWORD dwFlags = 0,DWORD dwProcessId = 0);
11    ~CToolHelp();
12
13    BOOL CreateSnapshot(DWORD dwFlags,DWORD dwProcessId = 0);
14
15    BOOL ProcessFirst(PPROCESSENTRY32 ppe);
16    BOOL ProcessNext(PPROCESSENTRY32 ppe);
17    BOOL ProcessFind(DWORD dwProcessId,PPROCESSENTRY32 ppe) ;
18}
Q?br>19#endif
20
      cpp实现文g如下
 1///////////////////////////////////////////////////////////////////////////////
 2
 3CToolHelp::CToolHelp(DWORD dwFlags,DWORD dwProcessId)
 4{
 5    m_hSnapshot=INVALID_HANDLE_VALUE;
 6    CreateSnapshot(dwFlags,dwProcessId);
 7}

 8
 9//////////////////////////////////////////////////////////////////////////////
10
11CToolHelp::~CToolHelp()
12{
13    if(m_hSnapshot != INVALID_HANDLE_VALUE)
14    {
15        CloseHandle(m_hSnapshot);
16    }

17}

18
19//////////////////////////////////////////////////////////////////////////////
20
21BOOL CToolHelp::CreateSnapshot(DWORD dwFlags,DWORD dwProcessId)
22{
23    if(m_hSnapshot != INVALID_HANDLE_VALUE)
24    {
25        CloseHandle(m_hSnapshot);
26    }

27    if(dwFlags == 0)
28    {
29        m_hSnapshot = INVALID_HANDLE_VALUE;
30    }

31    else
32    {
33        m_hSnapshot = CreateToolhelp32Snapshot(dwFlags,dwProcessId);
34    }

35    return m_hSnapshot != INVALID_HANDLE_VALUE;
36}

37
38////////////////////////////////////////////////////////////////////////////
39
40BOOL CToolHelp::ProcessFirst(PPROCESSENTRY32 ppe)
41{
42    BOOL fOk = Process32First(m_hSnapshot,ppe);
43    if (fOk && (ppe->th32ParentProcessID==0))
44    {
45        fOk = ProcessNext(ppe);
46    }

47    return fOk;
48}

49
50////////////////////////////////////////////////////////////////////////////
51
52BOOL CToolHelp::ProcessNext(PPROCESSENTRY32 ppe)
53{
54    BOOL fOk = Process32Next(m_hSnapshot,ppe);
55    if (fOk && (ppe->th32ParentProcessID==0))
56    {
57        fOk = ProcessNext(ppe);
58    }

59    return fOk;
60}

61
62//////////////////////////////////////////////////////////////////////////////
63
64BOOL CToolHelp::ProcessFind(DWORD dwProcessId,PPROCESSENTRY32 ppe)
65{
66    BOOL fFound = FALSE;
67    for(BOOL fOk=ProcessFirst(ppe); fOk ;fOk = ProcessNext(ppe))
68    {
69        fFound = (ppe->th32ProcessID == dwProcessId);
70        if(fFound)
71        {
72            break;
73        }

74    }

75    return TRUE;
76}
      声明Q上面的代码的构思及(qing)实现都是Jeffreyq位大牛的一些片断代码?br>      
         q程是系l的内核对象Q内核对象就是仅有系l内核管理的一块内存数据结构。从q段内核对象的代码里我们可以看出内核对象为系l内核所专有讉K权,也说明了(jin)内核对象在系l中存有其数信息。ؓ(f)此上面就用了(jin)q个函数
         HANDLE  m_hSnapshot  =  CreateToolhelp32Snapshot(dwFlgs,dwProcessId);
来徏立一份系l的快照。对于这个函数的两个参数Q前一个是指明立快照的类型,后一个是指明是否针对某一个特D的q程ID的快照。在我们有了(jin)pȝ的快照之后。我们将用下面的两个函数来浏览快照中的进E信息?br>               PROCESSENTRY32 pe = { sizeof(pe) };
               BOOL  Process32First(m_hSnapshot,&pe);
               BOOL  Process32Next(m_hSnapshot,&pe);
对于上述要注明一点的是pel构必须初始化,否则不?x)成功。这h来要实现pȝq程的枚举也p么几个函C(jin)。上面这U实现方法在win95 ,win98,win2000,winxp,?qing)win2003中都能够q样?br>
         上面介绍?jin)通用的一U方法,下面再介l一U不能在win95,win98中的枚DҎ(gu)Q这原因q得从MS的windows NT开发小l说P他们更中意下面的枚DҎ(gu)?br>         利用psapi.dll中提供的函数来实现进E等内核对象的枚举?br>            BOOL EnumProcesses(DWORD *pdwProcess,DWORD cb,DWORD cbNeeded);
         当然q可枚D其它的内核对象?br>
      好了(jin)pȝq程的枚举暂且就回忆到这里?br>

Robertxiao 2008-05-02 14:51 发表评论
]]>
q程初探?lt;3> q程Mhttp://www.shnenglu.com/Robertxiao/archive/2008/03/22/45113.htmlRobertxiaoRobertxiaoSat, 22 Mar 2008 08:05:00 GMThttp://www.shnenglu.com/Robertxiao/archive/2008/03/22/45113.htmlhttp://www.shnenglu.com/Robertxiao/comments/45113.htmlhttp://www.shnenglu.com/Robertxiao/archive/2008/03/22/45113.html#Feedback0http://www.shnenglu.com/Robertxiao/comments/commentRss/45113.htmlhttp://www.shnenglu.com/Robertxiao/services/trackbacks/45113.html      正常MQ寿l正寝指的是q程完成?jin)它的工作,它走C(jin)它生命的头。于是穿q一个花括号Q好似穿q一片E薄的白云而登仙乐?br>如下的一个简单的例子?br>
#include <iostream.h>

int main()
{
    
int i=2;
    
if(2==i)
    
{
        i
++;
    }

    
return i;
}
上面q个例子׃(x)在执行完return i;之后?{"寿终正寝。没有执行完q个花括号就不能作寿终正寝。比如说q时有一个高优先U的U程取得?jin)CPU的用权Qƈ用将q个q程杀L?br>      q程的意外死亡可以有自己来操U也可以是外部力而它突然终止。进E要杀死自己很单,只要调用ExitProcessp?jin)。这个函数功能是很强Q以致有些霸道。会(x)使进E来不及(qing)释放有关的资源比如用new操作W申L(fng)一D内存,调用?jin)第三组件而不能再Mؓ(f)W三方的lg执行一个Release q样的通知。这样引L(fng)问题g相当不妙。幸好这个进E的内核对象?x)随着它的M而减引用计数或者被收回。所以用这个函数时q是三思而行Q应量避免。那么外部的一个线E又该如何终止进E呢Q这得用TerminateProcessq个函数?jin),惌的是q个函数象前面的函数一样也是立即终止一个进E,而不?x)给被终止的q程留一口气。上q这两种Ҏ(gu)用v来还是三思ؓ(f)好。对于有H口的应用程序有更漂亮的Ҏ(gu)来让它退出,扑ֈq个q程的窗口,然后对着q个H口发一个退出的消息。这样就比较文明?jin),因?f)有机?x)给E序做一些善后的工作。如下的E序可以终止你已经开启的计算器程序?br>
#include "stdafx.h"
#include 
<windows.h>
#include 
<iostream.h>

int main(int argc, char* argv[])
{
    DWORD dwCurrentId,dwControlId;
    dwCurrentId
=GetCurrentProcessId();
    cout
<<"Current process Id: "<<dwCurrentId<<endl;
    HWND hwnd
=FindWindow("SciCalc",NULL);    
    GetWindowThreadProcessId(hwnd,
&dwControlId);
    HANDLE controlHandle
=OpenProcess(PROCESS_ALL_ACCESS,FALSE,dwControlId);
    cout
<<"Calc Process Id :"<<dwControlId<<endl;
    
//PostMessage(hwnd,WM_QUIT,0,0);
    TerminateProcess(controlHandle,0);
    
return 0;
}

我注释掉的postҎ(gu)是文明l止q程的例子?br>
      当我玩游戏过?jin)通关Ӟ只能自豪地看着我操控的角色I着金色的战衣,采飞扬地面对着东方徐徐升v的太阛_分钟。而后机器又恢复到?jin)启动的状态,q一切也pM(jin)。我也得赶快q回学校M晚自?fn)。但是这里的q不是我玩游戏的所有乐,真的乐趣q是在战斗的q程中。进E的吸引Z不会(x)只这么一点,q有更精采的要上演........?

Robertxiao 2008-03-22 16:05 发表评论
]]>
q程初探?lt;2> 创徏q程http://www.shnenglu.com/Robertxiao/archive/2008/03/21/45079.htmlRobertxiaoRobertxiaoFri, 21 Mar 2008 14:02:00 GMThttp://www.shnenglu.com/Robertxiao/archive/2008/03/21/45079.htmlhttp://www.shnenglu.com/Robertxiao/comments/45079.htmlhttp://www.shnenglu.com/Robertxiao/archive/2008/03/21/45079.html#Feedback0http://www.shnenglu.com/Robertxiao/comments/commentRss/45079.htmlhttp://www.shnenglu.com/Robertxiao/services/trackbacks/45079.html        今年前段旉Q我原来的一个同事突然打?sh)话l我。v因是客户不让开发商在服务器上安装Q何的应用E序Q只允许部v|站。但是,q个应用pȝ的部份功能又用到?jin)第三方的组件。组件肯定是要进行安装的Q当然这栯也存在不对的地方Q比如我可引用这个组件就像引用一个私有程序集的引用一P而再专门做一个适配器来做一个中转,q样肯定也能解决问题。我惛_我前D늚中可能已l存一定的Ҏ(gu)?jin),首先我假设?jin)客户知道lg的内部实现这些行Z(jin)Q而这一点就与COM要求的隐藏性相q背?jin)。就后一U方法能够实玎ͼq时我们把lg退化成一个DLL也行Q这L(fng)“退?#8221;如在目之初C是可以的。但C(jin)q行交互之时要做q些的改动,肯定?x)对q个pȝ产生诸如目DELAYQ系l的改动大也?x)相应地引vpȝ的不E_Q开发h员的重新投入Q测试的重新q行。在后期q行q项工作对一个开发商来说无疑是一个噩梦。或许有Z(x)说这个客户也太不讲理?jin),但是开发商也有一定的疏忽之责Q如果在开发之初便已了(jin)解到q个U束那么在开发之初就可以定许多很好的方案来解决q个问题。这时是?#8220;p弄”客户的时候了(jin)Q其实这U安装组件ƈ不会(x)对客户造成影响Q当然本人是说这个组件要是可信懒的,如果真的重新来修改应用系l的话,可能造成pȝ不稳定及(qing)客户错过恰当的应用时机,q样?x)对客户造成一定的损失。这是对客户的一U?#8220;伤害”。就象我们很多h怕了(jin)吃苦药,孩子就更是?jin),有的孩吃到苦药全部吐出来Q这时药厂就在这个苦药上包上一层的p衣。这U?#8220;ƺ骗”是善意?jin)。于是上面的问题可以用后台启动注册q程来完成这伟大的工作?br>         WINDOWS创徏q程的方法有多种Q我更喜ƢVC~程Q我q里列丑ևUVC的进E创建方法?br>         >>WinExec q种创徏q程的方法是沿用原来win16pȝ下用的Ҏ(gu)?br>         >>ShellExecute      win32 api
         >>ShellExecuteEx     win32 api
         >>CreateProcess        win32 api
        >>使用lg的进E激zL?br>      在下面的例子中我只用上面的四U方法,lg的激zL法在q里׃叙述?jin)?br>

 1// CreateProcess.cpp : Defines the entry point for the console application.
 2//
 3
 4#include "stdafx.h"
 5#include "windows.h"
 6#include "shellapi.h"
 7
 8//#pragma comment(lib,"shell32.lib")  如果在链接项中没有设|,在q里加上q个链接?br> 9/*******************************************************************************
10//   printf the help message
11//
12******************************************************************************/
13
14void Help()
15{
16    printf("Here are there some create process method!\n");
17    printf("1:Use winexec.\n");
18    printf("2:Use ShellExecute.\n");
19    printf("3:Use ShellExecuteEx.\n");
20    printf("4:Use CreateProcess.\n");
21    printf("Q:Quit the application.\n");
22}
23int main(int argc, char* argv[])
24{
25    bool bQuit=false;
26    UINT uCode=0;
27    SHELLEXECUTEINFO Info;
28    STARTUPINFO startInfo;
29    PROCESS_INFORMATION pInfo;
30    while(!bQuit)
31    {
32        Help();
33        char ch=getchar();
34        getchar();
35        switch(ch)
36        {
37        case '1':
38            uCode=WinExec("notepad.exe",SW_SHOW);
39            break;
40        case '2':
41            uCode=(UINT)ShellExecute(NULL,"open","notepad.exe",NULL,NULL,SW_SHOW);
42            break;
43        case '3':
44            {                
45                memset(&Info,0,sizeof(Info));
46                Info.cbSize=sizeof(Info);
47                Info.lpVerb="open";
48                Info.lpFile="notepad.exe";
49                Info.lpParameters=NULL;
50                Info.fMask=SEE_MASK_NOCLOSEPROCESS;
51                Info.nShow=SW_SHOWDEFAULT;
52                ShellExecuteEx(&Info);
53            }
54            break;
55        case '4':
56            {
57                memset(&startInfo,0,sizeof(startInfo));
58                startInfo.cb=sizeof(startInfo);
59                CreateProcess(NULL,"notepad.exe",NULL,NULL,FALSE,NORMAL_PRIORITY_CLASS,NULL,NULL,&startInfo,&pInfo);
60            }
61            break;
62        case 'Q':
63            bQuit=true;
64            break;
65        default:
66            break;
67        }
68    }
69    return 0;
70}

      上面的示例代码就q么,当然使用h不会(x)象文章中q样单,但是关键的也是q些?jin)。对创徏q程是q么单?br>      我很喜欢玩两个h比武的游戏,在其中我取得?jin)很多的乐趣Q给开游戏厅的老板了(jin)wؓ(f)热血年的一份心(j)Q也为国家多一份税收。我玩的角色武功套\也就只有q么几招Q招式是单了(jin)些,但很有用Q不是吗Q我l常两个铜牌可以玩上一两个时时辰?br>

       

Robertxiao 2008-03-21 22:02 发表评论
]]>
q程初探?lt;1> 基础知识http://www.shnenglu.com/Robertxiao/archive/2008/03/16/44642.htmlRobertxiaoRobertxiaoSun, 16 Mar 2008 13:59:00 GMThttp://www.shnenglu.com/Robertxiao/archive/2008/03/16/44642.htmlhttp://www.shnenglu.com/Robertxiao/comments/44642.htmlhttp://www.shnenglu.com/Robertxiao/archive/2008/03/16/44642.html#Feedback0http://www.shnenglu.com/Robertxiao/comments/commentRss/44642.htmlhttp://www.shnenglu.com/Robertxiao/services/trackbacks/44642.html        在读书的时候,我非常喜Ƣ玩늎。所q未辑ֺ寝忘食之境界Q否则向来生zL据的父母定要为生?败家?而伤感万分。但是却又是我的每日必修之课。下午,一下完译֯当日所学作好一个复?fn)笔记或是回到寝室稍作回忆。及(qing)臛_完晚饭藉以散步之名而往游戏厅方向急行。唯恐到晚了(jin)便没有机子玩。每天定量消费两个铜牌也?毛钱吧,但那时算是贵?jin)。更有一ơ到外地玩,发现那里铜牌便宜1元钱?0个,背了(jin)10元钱回校Q我也因此而在班里扬名。自觉此为本人所赚之W一W钱Q可其?#8220;勤工俭学“?br>       自思电(sh)玩也是一台破机器而已Q何以让如此多的英雄为它竟折腰。百思之Q终一日得其解。就我而言Q是莫过于我能控制其中的角色Q虽我能操控Ӟ但却又屡不能达自如之E度。常常在游戏机前暴蟩如雷又或嗟叹不已Q偶而也能神采奕奕,自ؓ(f)天下之大Q我皆能胜,向֐定有为?img src="http://www.shnenglu.com/CuteSoft_Client/CuteEditor/images/emsmile.gif" align=absMiddle border=0>

         而后向֏为电(sh)脑而痴QM惛_本h?#8221;C“之中操控已有应用E序Q似乎于此便有些成就之感。可谓之童心(j)有增Q或可谓之好事之人?br>我将如何来操U这些应用程序呢Q这里就先得说进E这个东西了(jin)。记得李莫愁曾有云:(x)问天下情Z物,直叫人生ȝ怹词。进E又Z?br>它是pȝ中进行系l资源分配、调度和理的最单位了(jin)。情Zh之所发,而进E却又是随程序的q行而生,E序是静(rn)态的Q进E是zd的。程序运行才?x)有q程Q程序ƈ不一定只有一个进E,它可以对应多个进E?br>
         q程是动态的Q它在整个生命周期中可以l过几个状态大致上说是Q运行态,qA态,d态。而如果细分之可ZU,另外多的q两U是挂vqA态,挂vd态。整个控制过E如?br> 
                                                                                             q行                                                                                           

                                           ?/span>↑    ?/span>                                                                                        
                                                                                    qA    d
                                                                                      ↑       ↑ 

                                                                            挂vqA       挂vd
                                                                     (其运行还可以直接转到挂vqA?

         pȝ是如何才能对q程如此灉|地控制呢Q可谓要其生Q其便生Q要其休息其便要休息。这全功于每个进E都有一个标讎ͼ叫做q程控制块这L(fng)一个数据结构,q个数据l构是一个内核对象。何又ؓ(f)内核对象Q内核对象本质就是内核分配的一个内存块它只能ؓ(f)内核才能讉K。它是进E可以被打断而后又能在打断点恢复q行的基Q一般来说这个信息是帔R内存的。正是有上述q个数据l构pȝ才能对进E进行自如地调度。简单地说系l对q程的调度主要有以下三种Ҏ(gu)Q先来先服务Q优先数调度Q轮转法?br>

Robertxiao 2008-03-16 21:59 发表评论
]]>
þǿdŮվ| 99þùۺϾƷ| þݺҹҹ2020һ| ĻƷѾþþ| þþþAVƬ| ˾ƷǾþ| ޹Ʒľþþ| 91ƷùۺϾþ| þþƷ| Ʒþ99| պŷþþwwwۺ| 99999þþþþ| vaĻþò| þù¶ƷӰ| ݺɫþۺ| һɫþ99һۺ| ˾þô߽av| þþƷа| avþþƷ| þþþ޾Ʒһ| þþƷAV͵| 99þþƷһ| 99999þþþþ| ˾þƵ| þþƷWWW456C0M| þԭav| þۺɫһ| һһþAþۺϾƷ| ۲˾þþƷٸAV| þùƷһƷ| Ʒþþþþù| þó18վ| þëƬһ| þùѹۿƷ3| ƷVIDEOSSEXþ÷| ɫۺϺϾþۿ| ŷAŷaþ| wwwɫ˾þþƷ| һaƬþëƬ| AVþþþòվ | þþþƷձһ|