iTimothy

君看一叶舟,出没风波里


  • 首页

  • 分类

  • 归档

  • 项目

  • 关于

数据类型转换示例

发表于 2005-02-17 | 分类于 技术控 | | 阅读次数:
字数统计: 819 字 | 阅读时长 ≈ 3 分钟

刚接触VC编程的朋友往往对许多数据类型的转换感到迷惑不解,本文将介绍一些常用数据类型的使用。

我们先定义一些常见类型变量借以说明

int i = 100; long l = 2001; float f=300.2; double d=12345.119; char username[]=”女侠程佩君”; char temp[200]; char *buf; CString str; _variant_t v1; _bstr_t v2;

一、其它数据类型转换为字符串

短整型(int) itoa(i,temp,10);///将i转换为字符串放入temp中,最后一个数字表示十进制 itoa(i,temp,2); ///按二进制方式转换 长整型(long) ltoa(l,temp,10);

二、从其它包含字符串的变量中获取指向该字符串的指针

CString变量 str = “2008北京奥运”; buf = (LPSTR)(LPCTSTR)str; BSTR类型的_variant_t变量 v1 = (_bstr_t)”程序员”; buf = _com_util::ConvertBSTRToString((_bstr_t)v1);

三、字符串转换为其它数据类型 strcpy(temp,”123”);

短整型(int) i = atoi(temp); 长整型(long) l = atol(temp); 浮点(double) d = atof(temp);

四、其它数据类型转换到CString 使用CString的成员函数Format来转换,例如:

整数(int) str.Format(“%d”,i); 浮点数(float) str.Format(“%f”,i); 字符串指针(char *)等已经被CString构造函数支持的数据类型可以直接赋值 str = username;

五、BSTR、_bstr_t与CComBSTR

CComBSTR、_bstr_t是对BSTR的封装,BSTR是指向字符串的32位指针。 char *转换到BSTR可以这样: BSTR b=_com_util::ConvertStringToBSTR

(“数据”);///使用前需要加上头文件comutil.h 反之可以使用char *p=_com_util::ConvertBSTRToString(b);

六、VARIANT 、_variant_t 与 COleVariant

VARIANT的结构可以参考头文件VC98\Include\OAIDL.H中关

于结构体tagVARIANT的定义。 对于VARIANT变量的赋值:首先给vt成员赋值,指明数据类型,

再对联合结构中相同数据类型的变量赋值,举个例子: VARIANT va; int a=2001; va.vt=VT_I4;///指明整型数据 va.lVal=a; ///赋值

对于不马上赋值的VARIANT,最好先用

Void VariantInit(VARIANTARG FAR* pvarg);进行初始化,其本质

是将vt设置为VT_EMPTY,下表我们列举vt与常用数据的对应关系:

unsigned char bVal; VT_UI1 short iVal; VT_I2 long lVal; VT_I4 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 BSTR bstrVal; VT_BSTR IUnknown FAR punkVal; VT_UNKNOWN IDispatch FAR pdispVal; VT_DISPATCH SAFEARRAY FAR parray; VT_ARRAY| unsigned char FAR pbVal; VT_BYREF|VT_UI1 short FAR piVal; VT_BYREF|VT_I2 long FAR plVal; VT_BYREF|VT_I4 float FAR pfltVal; VT_BYREF|VT_R4 double FAR pdblVal; VT_BYREF|VT_R8 VARIANT_BOOL FAR pboolVal; VT_BYREF|VT_BOOL SCODE FAR pscode; VT_BYREF|VT_ERROR CY FAR pcyVal; VT_BYREF|VT_CY DATE FAR pdate; VT_BYREF|VT_DATE BSTR FAR pbstrVal; VT_BYREF|VT_BSTR IUnknown FAR FAR ppunkVal; VT_BYREF|VT_UNKNOWN IDispatch FAR FAR ppdispVal; VT_BYREF|VT_DISPATCH SAFEARRAY FAR FAR pparray; VT_ARRAY| VARIANT FAR pvarVal; VT_BYREF|VT_VARIANT void FAR* byref; VT_BYREF

_variant_t是VARIANT的封装类,其赋值可以使用强制类型转换,

其构造函数会自动处理这些数据类型。 例如: long l=222; ing i=100; _variant_t lVal(l); lVal = (long)i;

COleVariant的使用与_variant_t的方法基本一样,请参考如下例子: COleVariant v3 = “字符串”, v4 = (long)1999; CString str =(BSTR)v3.pbstrVal; long i = v4.lVal;

七、其它

对消息的处理中我们经常需要将WPARAM或LPARAM

等32位数据(DWORD)分解成两个16位数据(WORD),例如: LPARAM lParam; WORD lovalue = LOWORD(lParam);///取低16位 WORD hivalue = HIWORD(lParam);///取高16位 对于16位的数据(WORD)我们可以用同样的方法分解成

高低两个8位数据(BYTE),例如: WORD wvalue; BYTE lovalue = LOBYTE(wvalue);///取低8位 BYTE hivalue = HIBYTE(wvalue);///取高8位

截屏操作

发表于 2005-02-06 | 分类于 技术控 | | 阅读次数:
字数统计: 81 字 | 阅读时长 ≈ 1 分钟

OnInitDialog中: // TODO: Add extra initialization here CDC dc; CBitmap *pBmp = NULL; dc.CreateDC(“DISPLAY”, NULL, NULL, NULL);

pMemDC = new CDC; if (!pMemDC) return FALSE; pMemDC->CreateCompatibleDC(&dc;);

pBmp = new CBitmap; if (!pBmp) return FALSE; pBmp->CreateCompatibleBitmap(&dc;, 1024, 768); pMemDC->SelectObject(pBmp); ShowWindow(SW_HIDE);

pMemDC->BitBlt(0, 0, 1024, 768, &dc;, 0, 0, SRCCOPY);

dc.DeleteDC(); pBmp->DeleteObject(); delete pBmp; OnPaint中: CPaintDC dc(this); dc.BitBlt(0,0,1024, 768, pMemDC, 0, 0, SRCCOPY);

枚举特定进程的所有线程列表

发表于 2005-02-04 | 分类于 技术控 | | 阅读次数:
字数统计: 216 字 | 阅读时长 ≈ 1 分钟

The following example obtains a list of running threads for the specified process. First, the RefreshThreadList function takes a snapshot of the currently executing threads in the system using the CreateToolhelp32Snapshot function, then it walks through the list recorded in the snapshot, using the Thread32First and Thread32Next functions. The parameter for RefreshThreadList is the identifier of the process whose threads will be listed.

#include

#include

#include

BOOL RefreshThreadList (DWORD dwOwnerPID) { HANDLE hThreadSnap = NULL; BOOL bRet = FALSE; THREADENTRY32 te32 = {0};

// Take a snapshot of all threads currently in the system.

hThreadSnap = CreateToolhelp32Snapshot(TH32CS_SNAPTHREAD, 0);
if (hThreadSnap == INVALID_HANDLE_VALUE)
    return (FALSE);

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

te32.dwSize = sizeof(THREADENTRY32);

// Walk the thread snapshot to find all threads of the process.
// If the thread belongs to the process, add its information
// to the display list.

if (Thread32First(hThreadSnap, &te32;))
{
    do
    {
        if (te32.th32OwnerProcessID == dwOwnerPID)
        {
            printf( "\nTID\t\t%d\n", te32.th32ThreadID);
            printf( "Owner PID\t%d\n", te32.th32OwnerProcessID);
            printf( "Delta Priority\t%d\n", te32.tpDeltaPri);
            printf( "Base Priority\t%d\n", te32.tpBasePri);
        }
    }
    while (Thread32Next(hThreadSnap, &te32;));
    bRet = TRUE;
}
else
    bRet = FALSE;          // could not walk the list of threads

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

CloseHandle (hThreadSnap);

return (bRet);

}

TAB中加入子窗口

发表于 2005-02-04 | 分类于 技术控 | | 阅读次数:
字数统计: 60 字 | 阅读时长 ≈ 1 分钟

m_Tab.InsertItem(0,”第一页”); m_Tab.InsertItem(1,”第二页”); m_Tab.InsertItem(2,”第三页”); m_Tab.InsertItem(3,”第四页”);

m_PageA.Create(IDD_PROPPAGE_A,&m;_Tab);
m_PageB.Create(IDD_PROPPAGE_B,&m;_Tab);
m_PageC.Create(IDD_PROPPAGE_C,&m;_Tab);
m_PageD.Create(IDD_PROPPAGE_D,&m;_Tab);

m_PageA.ShowWindow(SW_SHOW);
m_PageB.ShowWindow(SW_HIDE);
m_PageC.ShowWindow(SW_HIDE);
m_PageD.ShowWindow(SW_HIDE);

RICHEDIT中插入GIF

发表于 2005-02-02 | 分类于 技术控 | | 阅读次数:
字数统计: 467 字 | 阅读时长 ≈ 2 分钟

用qq的ImageOle.dll

// MyRichEdit.cpp : implementation file //

#include “stdafx.h”

#include “ZJP.h”

#include “MyRichEdit.h”

#include “Richole.h”

#import “E:\Program files\tencent\qq\ImageOle.dll” named_guids

#ifdef _DEBUG

#define new DEBUG_NEW

#undef THIS_FILE static char THIS_FILE[] = FILE;

#endif

///////////////////////////////////////////////////////////////////////////// // CMyRichEdit

CMyRichEdit::CMyRichEdit() { }

CMyRichEdit::~CMyRichEdit() { }

BEGIN_MESSAGE_MAP(CMyRichEdit, CRichEditCtrl) //{AFX_MSG_MAP(CMyRichEdit) // NOTE - the ClassWizard will add and remove mapping macros here. //}AFX_MSG_MAP END_MESSAGE_MAP()

///////////////////////////////////////////////////////////////////////////// // CMyRichEdit message handlers

void CMyRichEdit::InsertGraphics(CString strPicPath) { LPLOCKBYTES lpLockBytes = NULL; SCODE sc; HRESULT hr; //print to RichEdit’ s IClientSite LPOLECLIENTSITE m_lpClientSite; //A smart point to IAnimator ImageOleLib::IGifAnimatorPtr m_lpAnimator; //ptr 2 storage LPSTORAGE m_lpStorage; //the object 2 b insert 2 LPOLEOBJECT m_lpObject; //Create lockbytes sc = ::CreateILockBytesOnHGlobal(NULL, TRUE, &lpLockBytes;); if (sc != S_OK) AfxThrowOleException(sc); ASSERT(lpLockBytes != NULL); //use lockbytes to create storage sc = ::StgCreateDocfileOnILockBytes(lpLockBytes, STGM_SHARE_EXCLUSIVE ¦STGM_CREATE ¦STGM_READWRITE, 0, &m;_lpStorage); if (sc != S_OK) { VERIFY(lpLockBytes->Release() == 0); lpLockBytes = NULL; AfxThrowOleException(sc); } ASSERT(m_lpStorage != NULL); //get the ClientSite of the very RichEditCtrl GetIRichEditOle()->GetClientSite(&m;_lpClientSite); ASSERT(m_lpClientSite != NULL); try { //Initlize COM interface

            hr  =  ::CoInitialize(NULL)  ;//(  NULL,  COINIT_APARTMENTTHREADED  );
            if(  FAILED(hr)  )
                        _com_issue_error(hr);

            //Get  GifAnimator  object
            //here,  I  used  a  smart  point,  so  I  do  not  need  to  free  it
            hr  =  m_lpAnimator.CreateInstance(ImageOleLib::CLSID_GifAnimator);
            if(  FAILED(hr)  )
                                    _com_issue_error(hr);
            //COM  operation  need  BSTR,  so  get  a  BSTR
            BSTR  path  =  strPicPath.AllocSysString();

            //Load  the  gif
            hr  =  m_lpAnimator->LoadFromFile(path);
            if(  FAILED(hr)  )
                        _com_issue_error(hr);

            TRACE0(  m_lpAnimator->GetFilePath()  );

            //get  the  IOleObject
            hr  =  m_lpAnimator.QueryInterface(IID_IOleObject,  (void**)&m;_lpObject);
            if(  FAILED(hr)  )
                        _com_issue_error(hr);

            //Set  it  2  b  inserted
            OleSetContainedObject(m_lpObject,  TRUE);

//2  insert  in  2  richedit,  you  need  a  struct  of  REOBJECT
            REOBJECT  reobject;
            ZeroMemory(&reobject;,  sizeof(REOBJECT));

            reobject.cbStruct  =  sizeof(REOBJECT);
            CLSID  clsid;
            sc  =  m_lpObject->GetUserClassID(&clsid;);
            if  (sc  !=  S_OK)
                        AfxThrowOleException(sc);
            //set  clsid
            reobject.clsid  =  clsid;
            //can  be  selected
            reobject.cp  =  REO_CP_SELECTION;
            //content,  but  not  static
            reobject.dvaspect  =  DVASPECT_CONTENT;
            //goes  in  the  same  line  of  text  line
            reobject.dwFlags  =  REO_BELOWBASELINE;  //REO_RESIZABLE    ¦
            reobject.dwUser  =  0;
            //the  very  object
            reobject.poleobj  =  m_lpObject;
            //client  site  contain  the  object
            reobject.polesite  =  m_lpClientSite;
            //the  storage
            reobject.pstg  =  m_lpStorage;

            SIZEL  sizel;
            sizel.cx  =  sizel.cy  =  0;
            reobject.sizel  =  sizel;
            HWND  hWndRT  =  this->m_hWnd;
            //Sel  all  text

// ::SendMessage(hWndRT, EM_SETSEL, 0, -1); // DWORD dwStart, dwEnd; // ::SendMessage(hWndRT, EM_GETSEL, (WPARAM)&dwStart;, (LPARAM)&dwEnd;); // ::SendMessage(hWndRT, EM_SETSEL, dwEnd+1, dwEnd+1); //Insert after the line of text GetIRichEditOle()->InsertObject(&reobject;); ::SendMessage(hWndRT, EM_SCROLLCARET, (WPARAM)0, (LPARAM)0); VARIANT_BOOL ret; //do frame changing ret = m_lpAnimator->TriggerFrameChange(); //show it m_lpObject->DoVerb(OLEIVERB_UIACTIVATE, NULL, m_lpClientSite, 0, m_hWnd, NULL); m_lpObject->DoVerb(OLEIVERB_SHOW, NULL, m_lpClientSite, 0, m_hWnd, NULL);

            //redraw  the  window  to  show  animation
            RedrawWindow();

            if  (m_lpClientSite)
            {
                        m_lpClientSite->Release();
                        m_lpClientSite  =  NULL;
            }
            if  (m_lpObject)
            {
                        m_lpObject->Release();
                        m_lpObject  =  NULL;
            }
            if  (m_lpStorage)
            {
                        m_lpStorage->Release();
                        m_lpStorage  =  NULL;
            }

            SysFreeString(path);
}
catch(  _com_error  e  )
{
            AfxMessageBox(e.ErrorMessage());
            ::CoUninitialize();
}

}

根据文件句柄,获取文件名

发表于 2005-01-31 | 分类于 技术控 | | 阅读次数:
字数统计: 223 字 | 阅读时长 ≈ 1 分钟

#include

#include

#include

#include

#include

#define BUFSIZE 512

BOOL GetFileNameFromHandle(HANDLE hFile) { BOOL bSuccess = FALSE; TCHAR pszFilename[MAX_PATH+1]; HANDLE hFileMap;

// Get the file size. DWORD dwFileSizeHi = 0; DWORD dwFileSizeLo = GetFileSize(hFile, &dwFileSizeHi;);

if( dwFileSizeLo == 0 && dwFileSizeHi == 0 ) { printf(“Cannot map a file with a length of zero.\n”); return FALSE; }

// Create a file mapping object. hFileMap = CreateFileMapping(hFile, NULL, PAGE_READONLY, 0, 1, NULL);

if (hFileMap) { // Create a file mapping to get the file name. void* pMem = MapViewOfFile(hFileMap, FILE_MAP_READ, 0, 0, 1);

if (pMem)
{
  if (GetMappedFileName (GetCurrentProcess(),
                         pMem,
                         pszFilename,
                         MAX_PATH))
  {

    // Translate path with device name to drive letters.
    TCHAR szTemp[BUFSIZE];
    szTemp[0] = '\0';

    if (GetLogicalDriveStrings(BUFSIZE-1, szTemp))
    {
      TCHAR szName[MAX_PATH];
      TCHAR szDrive[3] = TEXT(" :");
      BOOL bFound = FALSE;
      TCHAR* p = szTemp;

      do
      {
        // Copy the drive letter to the template string
        *szDrive = *p;

        // Look up each device name
        if (QueryDosDevice(szDrive, szName, BUFSIZE))
        {
          UINT uNameLen = _tcslen(szName);

          if (uNameLen < MAX_PATH)
          {
            bFound = _tcsnicmp(pszFilename, szName,
                uNameLen) == 0;

            if (bFound)
            {
              // Reconstruct pszFilename using szTemp
              // Replace device path with DOS path
              TCHAR szTempFile[MAX_PATH];
              _stprintf(szTempFile,
                        TEXT("%s%s"),
                        szDrive,
                        pszFilename+uNameLen);
              _tcsncpy(pszFilename, szTempFile, MAX_PATH);
            }
          }
        }

        // Go to the next NULL character.
        while (*p++);
      } while (!bFound && *p); // end of string
    }
  }
  bSuccess = TRUE;
  UnmapViewOfFile(pMem);
}

CloseHandle(hFileMap);

} printf(“File name is %s\n”, pszFilename); return(bSuccess); }

SQL SERVER 与ACCESS、EXCEL的数据转换

发表于 2005-01-31 | 分类于 技术控 | | 阅读次数:
字数统计: 931 字 | 阅读时长 ≈ 4 分钟

熟悉SQL SERVER 2000的数据库管理员都知道,其DTS可以进行数据的导入导出,其实,我们也可以使用Transact-SQL语句进行导入导出操作。在Transact-SQL语句中,我们主要使用OpenDataSource函数、OPENROWSET 函数,关于函数的详细说明,请参考SQL联机帮助。利用下述方法,可以十分容易地实现SQL SERVER、ACCESS、EXCEL数据转换,详细说明如下:

一、 SQL SERVER 和ACCESS的数据导入导出

常规的数据导入导出:

使用DTS向导迁移你的Access数据到SQL Server,你可以使用这些步骤:

  1在SQL SERVER企业管理器中的Tools(工具)菜单上,选择Data Transformation

  2Services(数据转换服务),然后选择 czdImport Data(导入数据)。

  3在Choose a Data Source(选择数据源)对话框中选择Microsoft Access as the Source,然后键入你的.mdb数据库(.mdb文件扩展名)的文件名或通过浏览寻找该文件。

  4在Choose a Destination(选择目标)对话框中,选择Microsoft OLE DB Prov ider for SQL Server,选择数据库服务器,然后单击必要的验证方式。

  5在Specify Table Copy(指定表格复制)或Query(查询)对话框中,单击Copy tables(复制表格)。

6在Select Source Tables(选择源表格)对话框中,单击Select All(全部选定)。下一步,完成。

Transact-SQL语句进行导入导出:

  1. 在SQL SERVER里查询access数据:

– ======================================================

SELECT *

FROM OpenDataSource( ‘Microsoft.Jet.OLEDB.4.0’,

‘Data Source=”c:\DB.mdb”;User ID=Admin;Password=’)…表名


  1. 将access导入SQL server

– ======================================================

在SQL SERVER 里运行:

SELECT *

INTO newtable

FROM OPENDATASOURCE (‘Microsoft.Jet.OLEDB.4.0’,

'Data Source="c:\DB.mdb";User ID=Admin;Password=' )...表名

  1. 将SQL SERVER表里的数据插入到Access表中

– ======================================================

在SQL SERVER 里运行:

insert into OpenDataSource( ‘Microsoft.Jet.OLEDB.4.0’,

‘Data Source=” c:\DB.mdb”;User ID=Admin;Password=’)…表名

(列名1,列名2)

select 列名1,列名2 from sql表

实例:

insert into OPENROWSET(‘Microsoft.Jet.OLEDB.4.0’,

‘C:\db.mdb’;’admin’;’’, Test)

select id,name from Test

INSERT INTO OPENROWSET(‘Microsoft.Jet.OLEDB.4.0’, ‘c:\trade.mdb’; ‘admin’; ‘’, 表名)

SELECT *

FROM sqltablename


二、 SQL SERVER 和EXCEL的数据导入导出

1、在SQL SERVER里查询Excel数据:

– ======================================================

SELECT *

FROM OpenDataSource( ‘Microsoft.Jet.OLEDB.4.0’,

‘Data Source=”c:\book1.xls”;User ID=Admin;Password=;Extended properties=Excel 5.0’)…[Sheet1$]

下面是个查询的示例,它通过用于 Jet 的 OLE DB 提供程序查询 Excel 电子表格。

SELECT * FROM OpenDataSource ( ‘Microsoft.Jet.OLEDB.4.0’,

‘Data Source=”c:\Finance\account.xls”;User ID=Admin;Password=;Extended properties=Excel 5.0’)…xactions

2、将Excel的数据导入SQL server :

– ======================================================

SELECT * into newtable

FROM OpenDataSource( ‘Microsoft.Jet.OLEDB.4.0’,

‘Data Source=”c:\book1.xls”;User ID=Admin;Password=;Extended properties=Excel 5.0’)…[Sheet1$]

实例:

SELECT * into newtable

FROM OpenDataSource( ‘Microsoft.Jet.OLEDB.4.0’,

‘Data Source=”c:\Finance\account.xls”;User ID=Admin;Password=;Extended properties=Excel 5.0’)…xactions


3、将SQL SERVER中查询到的数据导成一个Excel文件

– ======================================================

T-SQL代码:

EXEC master..xp_cmdshell ‘bcp 库名.dbo.表名out c:\Temp.xls -c -q -S”servername” -U”sa” -P””‘

参数:S 是SQL服务器名;U是用户;P是密码

说明:还可以导出文本文件等多种格式

实例:EXEC master..xp_cmdshell ‘bcp saletesttmp.dbo.CusAccount out c:\temp1.xls -c -q -S”pmserver” -U”sa” -P”sa”‘

EXEC master..xp_cmdshell ‘bcp “SELECT au_fname, au_lname FROM pubs..authors ORDER BY au_lname” queryout C:\ authors.xls -c -Sservername -Usa -Ppassword’

在VB6中应用ADO导出EXCEL文件代码:

Dim cn As New ADODB.Connection

cn.open “Driver={SQL Server};Server=WEBSVR;DataBase=WebMis;UID=sa;WD=123;”

cn.execute “master..xp_cmdshell ‘bcp “SELECT col1, col2 FROM 库名.dbo.表名” queryout E:\DT.xls -c -Sservername -Usa -Ppassword’”


4、在SQL SERVER里往Excel插入数据:

– ======================================================

insert into OpenDataSource( ‘Microsoft.Jet.OLEDB.4.0’,

‘Data Source=”c:\Temp.xls”;User ID=Admin;Password=;Extended properties=Excel 5.0’)…table1 (A1,A2,A3) values (1,2,3)

T-SQL代码:

INSERT INTO

OPENDATASOURCE(‘Microsoft.JET.OLEDB.4.0’,

‘Extended Properties=Excel 8.0;Data source=C:\training\inventur.xls’)…[Filiale1$]

(bestand, produkt) VALUES (20, ‘Test’)


总结:利用以上语句,我们可以方便地将SQL SERVER、ACCESS和EXCEL电子表格软件中的数据进行转换,为我们提供了极大方便!

ShellExecute用法种种

发表于 2005-01-20 | 分类于 技术控 | | 阅读次数:
字数统计: 331 字 | 阅读时长 ≈ 1 分钟

Q: 如何打开一个应用程序? ShellExecute(this->m_hWnd,”open”,”calc.exe”,””,””, SW_SHOW );或 ShellExecute(this->m_hWnd,”open”,”notepad.exe”,”c:\MyLog.log”,””,SW_SHOW );正如您所看到的,我并没有传递程序的完整路径。

Q: 如何打开一个同系统程序相关连的文档?ShellExecute(this->m_hWnd,”open”,”c:\abc.txt”,””,””,SW_SHOW );

Q: 如何打开一个网页? ShellExecute(this->m_hWnd,”open”,”http://www.google.com","","", SW_SHOW );

Q: 如何激活相关程序,发送EMAIL? ShellExecute(this->m_hWnd,”open”,”mailto:[email protected]“,””,””, SW_SHOW );

Q: 如何用系统打印机打印文档? ShellExecute(this->m_hWnd,”print”,”c:\abc.txt”,””,””, SW_HIDE);

Q: 如何用系统查找功能来查找指定文件? ShellExecute(m_hWnd,”find”,”d:\nish”,NULL,NULL,SW_SHOW);

Q: 如何启动一个程序,直到它运行结束? SHELLEXECUTEINFO ShExecInfo = {0}; ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO); ShExecInfo.fMask = SEE_MASK_NOCLOSEPROCESS; ShExecInfo.hwnd = NULL; ShExecInfo.lpVerb = NULL; ShExecInfo.lpFile = “c:\MyProgram.exe”; ShExecInfo.lpParameters = “”; ShExecInfo.lpDirectory = NULL; ShExecInfo.nShow = SW_SHOW; ShExecInfo.hInstApp = NULL; ShellExecuteEx(&ShExecInfo;); WaitForSingleObject(ShExecInfo.hProcess,INFINITE); 或: PROCESS_INFORMATION ProcessInfo; STARTUPINFO StartupInfo; //This is an [in] parameter ZeroMemory(&StartupInfo;, sizeof(StartupInfo)); StartupInfo.cb = sizeof StartupInfo ; //Only compulsory field if(CreateProcess(“c:\winnt\notepad.exe”, NULL, NULL,NULL,FALSE,0,NULL, NULL,&StartupInfo;,&ProcessInfo;)) { WaitForSingleObject(ProcessInfo.hProcess,INFINITE); CloseHandle(ProcessInfo.hThread); CloseHandle(ProcessInfo.hProcess); } else { MessageBox(“The process could not be started…”); }

Q: 如何显示文件或文件夹的属性? SHELLEXECUTEINFO ShExecInfo ={0}; ShExecInfo.cbSize = sizeof(SHELLEXECUTEINFO); ShExecInfo.fMask = SEE_MASK_INVOKEIDLIST ; ShExecInfo.hwnd = NULL; ShExecInfo.lpVerb = “properties”; ShExecInfo.lpFile = “c:\“; //can be a file as well ShExecInfo.lpParameters = “”; ShExecInfo.lpDirectory = NULL; ShExecInfo.nShow = SW_SHOW; ShExecInfo.hInstApp = NULL; ShellExecuteEx(&ShExecInfo;);

程序热键的实现

发表于 2005-01-19 | 分类于 技术控 | | 阅读次数:
字数统计: 437 字 | 阅读时长 ≈ 1 分钟

[问题提出] 有的程序需要自定义组合键完成一定功能,如何实现?

[解决方法] RegisterHotKey函数原型及说明: BOOL RegisterHotKey( HWND hWnd, // 接收WM_HOTKEY的窗口句柄 int id, // hot key的ID号. UINT fsModifiers, // 响应那个热键. UINT vk // 与热键配合的键.

其中:
    1)id的说明:
    id为你自己定义的一个ID值,对一个线程来讲其值必需在0x0000  -  0xBFFF范围之内,对DLL来讲其值必需在0xC000  -  0xFFFF  范围之内,在同一进程内该值必须唯一

    2)fsModifiers的取值如下:
        .MOD_ALT
        .MOD_CONTROL
        .MOD_SHIFT
        .MOD_WIN

[程序实现] 建立名为My的对话框工程.本例要用到RegisterHotKey()实现Alt+D的快捷键组合功能.在调用该函数后你的进程会在ALT+D按下时比系统先得到通知.你需要处理的消息是WM_HOTKEY. 如下:

在MyDlg.h中:
class  CMyDlg  :  public  CDialog
{
          //  Construction
          public:
                  int  m_nHotKeyID;//为你自己定义的一个hot  key的ID值,在整个程序唯一.
          ........
          protected:
                  HICON  m_hIcon;

          //  Generated  message  map  functions
          //{AFX_MSG(CMyDlg)
          virtual  BOOL  OnInitDialog();
          afx_msg  void  OnSysCommand(UINT  nID,  LPARAM  lParam);
          afx_msg  void  OnPaint();
          afx_msg  HCURSOR  OnQueryDragIcon();
          afx_msg  LONG  OnHotKey(WPARAM  wParam,LPARAM  lParam);//手动加入.
          //}AFX_MSG
          DECLARE_MESSAGE_MAP()
};

在MyDlg.cpp中:
#define  VK_D  68

..............
BEGIN_MESSAGE_MAP(CMyDlg,  CDialog)
          //{AFX_MSG_MAP(CHotKey1Dlg)
          ON_WM_SYSCOMMAND()
          ON_WM_PAINT()
          ON_WM_QUERYDRAGICON()
          ON_BN_CLICKED(IDOK,  OnRegisterHotKey)
          ON_BN_CLICKED(IDCANCEL,  OnUnregisterHotKey)
          ON_MESSAGE(WM_HOTKEY,OnHotKey)                                          //手动加入.
          //}AFX_MSG_MAP
END_MESSAGE_MAP()

BOOL  CMyDlg::OnInitDialog()
{
          CDialog::OnInitDialog();

          //  Add  "About..."  menu  item  to  system  menu.
          m_nHotKeyID=0;
          BOOL  m_isKeyRegistered  =  RegisterHotKey(GetSafeHwnd(),m_nHotKeyID,MOD_ALT,VK_D);
          ASSERT(m_isKeyRegistered  !=  FALSE);
          return  TRUE;    //  return  TRUE    unless  you  set  the  focus  to  a  control
}

在取消按钮的事件函数中加入:
void  CMyDlg::OnCancel()
{
          BOOL  m_iskeyUnregistered  =  UnregisterHotKey(GetSafeHwnd(),  m_nHotKeyID);
          ASSERT(m_iskeyUnregistered  !=  FALSE);
          CDialog::OnCancel();
}

处理截到的组合键,并处理:
LONG  CMyDlg::OnHotKey(WPARAM  wParam,LPARAM  lParam)
{
          AfxMessageBox("你按下了组合键:Alt+D");
          //加入相关代码.
          return  0;
}

大家试试此功能,希望有不对之处给以指正.

开机自动运行

发表于 2005-01-16 | 分类于 技术控 | | 阅读次数:
字数统计: 106 字 | 阅读时长 ≈ 1 分钟

BOOL SetAutoRun(CString strPath)//开机自动运行 { CString str; HKEY hRegKey; BOOL bResult; str=_T(“Software\Microsoft\Windows\CurrentVersion\Run”); if(RegOpenKey(HKEY_LOCAL_MACHINE, str, &hRegKey;) != ERROR_SUCCESS) bResult=FALSE; else { _splitpath(strPath.GetBuffer(0),NULL,NULL,str.GetBufferSetLength(MAX_PATH+1),NULL); strPath.ReleaseBuffer(); str.ReleaseBuffer(); if(::RegSetValueEx( hRegKey, str, 0, REG_SZ, (CONST BYTE *)strPath.GetBuffer(0), strPath.GetLength() ) != ERROR_SUCCESS) bResult=FALSE; else bResult=TRUE; strPath.ReleaseBuffer(); } return bResult; }

其中strPath参数表示要设置为自运行的程序的绝对路径。当设置成功时返回true,否则返回false。

编程使计算机休眠

发表于 2005-01-16 | 分类于 技术控 | | 阅读次数:
字数统计: 62 字 | 阅读时长 ≈ 1 分钟

void CPage1::OnXiuMian() { if(MessageBox(“确实要休眠吗?”,”关机程序”,MB_YESNO|MB_DEFBUTTON2|MB_ICONQUESTION)==IDYES) { static HANDLE hToken; static TOKEN_PRIVILEGES tp; static LUID luid; if(::OpenProcessToken(GetCurrentProcess(), TOKEN_ADJUST_PRIVILEGES|TOKEN_QUERY, &hToken;)) { ::LookupPrivilegeValue(NULL,SE_SHUTDOWN_NAME,&luid;); tp.PrivilegeCount=1; tp.Privileges[0].Luid =luid; tp.Privileges[0].Attributes =SE_PRIVILEGE_ENABLED; ::AdjustTokenPrivileges(hToken,false,&tp;,sizeof(TOKEN_PRIVILEGES),NULL,NULL); } ::SetSystemPowerState(false,true); } }

修补了一些本站漏洞

发表于 2005-01-15 | 分类于 站点日志 | | 阅读次数:
字数统计: 41 字 | 阅读时长 ≈ 1 分钟

修补了一些本站漏洞,谢谢热心网友的提醒。 这一次把整个BLOG也更新了一次。 采用了GUO’S BLOG修改而成。

1…414243…47
Timothy

Timothy

Timothy的技术博客,记录技术以及生活点滴

564 日志
8 分类
1187 标签
RSS
github twitter
Links
  • ZWWoOoOo
  • 花開未央
  • 守望轩
  • 大漠说程序
  • ChengBo
  • BlueAndHack
  • 程序员小辉
  • 子痕的博客
  • WoodenRobot
  • VPS大佬
  • 毕扬博客
  • VPSDad
  • 猫爪导航
  • ss1271的奋斗
  • Kian.Li
  • YoungForest
  • Fred's Blog
  • Jacklandrin
© 2025 Timothy
由 Hexo 强力驱动
|
主题 — NexT.Muse v5.1.4