API 实例调查

Posted on 2007-10-02 10:24  hylotta  阅读(366)  评论(0)    收藏  举报
1.GetModuleFileName用来找到进程的相应可执行文件及路径

DWORD GetModuleFileName(
HMODULE hModule,
LPTSTR lpFilename,
DWORD nSize
);

获得hModule所指的文件的名字,
hModule在LoadLibrary之类的函数会返回,是一个句柄,用来标记这个文件资源。
lpFilename是你存放返回的名字的内存块的指针,是一个输出参数,nSize是这个内存块的大小,用于防止溢出。
返回值是用于指示是否发生错误的。

example:
char szFname[MAX_PATH];
。。。。。

GetModuleFileName(hModule, szBuff, MAX_PATH);
 _splitpath(szBuff, szDrive, szDir, szFname, szExt); 
 sprintf(szCurrent, "%s%s", szDrive, szDir);


2.EnumWindows 用来列举屏幕上所有顶层窗口

MSDN原话:

The EnumWindows function enumerates all top-level windows on the screen by passing the handle to each window。函数形式:

BOOL EnumWindows(  WNDENUMPROC lpEnumFunc,  // callback function  
LPARAM
lParam // application-defined value);
其中 WNDENUMPROC 是回调函数,回调函数中写自己想做的操作,当调用EnumWindows的
时候,每次遇到一个窗口,系统就调用一次你的WNDENUMPROC ,然后把窗口句柄传给你。
EnumWindows 
 函数成功则返回非0值;
 函数失败则返回0值;
 EnumWindowsProc 返回0值,同样导致函数EnumWindows 返回0值。
另外,该函数不列举子窗口,除了几种拥有WS_CHILD 风格的系统所属窗口。
MSDN原话:
The EnumWindows function does not enumerate child windows,with the exception 
of a few top-level windows owned by the system that have the WS_CHILD style. 
使用举例1:
先声明一个EnumWindowsProc ,比如:
BOOL CALLBACK EnumWindowsProc_1(HWND hwnd,LPARAM lparam) ;
然后实现此函数,写入自己想做的事情,比如:
BOOL CALLBACK EnumWindowsProc_1(HWND hwnd,LPARAM lparam)
{
 char lpWinTitle[256];
 ::GetWindowText(hwnd,lpWinTitle,256-1);
 CString m_strTitle;
 m_strTitle.Format("%s",lpWinTitle);
 
if(m_strTitle.Find("Internet Explorer")!=-1)
 {
  AfxMessageBox("这是一个IE窗口!") ;
 } 
 return TRUE ;
}



然后就可以在其他地方调用EnumWindows的时候使用回调函数,比如:
::EnumWindows(EnumWindowsProc_1,0) ;
这样每当遇到IE窗口时,就会进行 提示“这是一个IE窗口!” 的操作。








使用举例2:





BOOL CALLBACK EnumScreenSaverProc(HWND hWnd, LPARAM lParam);
BOOL CALLBACK EnumWaitScreenProc(HWND hWnd, LPARAM lParam);



int WINAPI WinMain(HINSTANCE hInstance,  
       HINSTANCE hPrevInstance, 
       LPSTR  lpCmdLine,  
       int   nCmdShow)  
{

 LPTSTR lpCmd;
 lpCmd = GetCommandLine();

 if(!strcmp(SAVER_CLOSE_COMMAND, lpCmd))
 {
  EnumWindows(EnumScreenSaverProc, NULL);

  return FALSE;
 }
 if(!strcmp(INFO_CLOSE_COMMAND, lpCmd))
 {
  EnumWindows(EnumWaitScreenProc, NULL);

  return FALSE;
 }

 return FALSE;
}



BOOL CALLBACK EnumScreenSaverProc(
          HWND hWnd,  
          LPARAM lParam) 
{
 if(GetProp(hWnd, "USB_KEY_SAVER_PROPERTY"))
 {
  SendMessage(hWnd, WM_SAVER_EXIT, NULL, NULL);
 }

 return TRUE;
}



BOOL CALLBACK EnumWaitScreenProc(
         HWND hWnd,   
         LPARAM lParam)  
{
 if(GetProp(hWnd, "USBKEY_WAIT_SCREEN"))
 {
  SendMessage(hWnd, WM_DESTROY, NULL, NULL);
 }

 return TRUE;
}


3.CreateFile ReadFile WriteFile
1. 创建和打开文件
创建任何一种文件只需要用到API函数CreateFile,应用程序可以通过该函数指定文件的格式为读取、写入或两者皆可,也可以指定是否为共享文件。如果该文件名已经存在,则将其打开。下面对函数CreateFile进行详细的介绍:
说明:本函数用于创建一个指定类列的文件。
原型 :HANDLE CreateFile(LPCTSTR lpFileName,
DWORD dwDesiredAccess,
DWORD dwShareMode,
LPSECURITY_ATTRIBUTES lpSecurityAttributes
DWORD dwCreationDisposition
DWORD dwFlagsAndAttributes
HANDLE hTemplateFile);
参数:lpFileName:是以空值结尾的字符串的指针,包含要创建、打开或截取的文件、管道、通信资源、磁盘设备或控制台的名称。
dwDesAccess:指定文件的输出类型。
dwShareMode:确定是否且如何共享这个文件。
lpSecurityAttributes:是指向SECURITY_ATTRIBUTES结构的指针,指定了目录的安全属性,但要求文件系统支持如NTFS的格式。Windows 98不支持此属性,在函数调用时应设置为NULL。
dwCreationDisposition:确定文件存在或不存在时所采取的动作。
dwFlagsAndAttributes:指定文件的属性和标志。
hTemplateFile:用于存取模板文件的句柄,模板文件为正在创建的文件提供扩展属性。
返回值
如果函数调用成功则返回打开文件的句柄。如果调用前文件已经存在,且
dwCreationDisposition参数使用CREATE_ALWAYS或OPEN_ALWAYS,
则返回ERROR_ALREADY_EXISTS。函数调用失败则返回INVALID_HANDLE_VALUE。
例如,创建一个在C:目录下名为"FILE.DOC"(Word文档)的文件的代码如下,其中hFile为HANDLE类型。
hFile=CreateFile("C:\\FILE.DOC",GENERIC_READ|GENERIC_WRITE.C,
NULL,OPEN_ALWAYS,FILE_ATTRISUTE_NORMAL,NULL);
2. 读取、写入和删除文件
在第一次打开文件时,Windows在文件的开头存放一个文件指针,文件指针所指的位置就是下一次读取或写入的地方。随着字节的读取或写入,Windows也相应增加文件指针。应用程序可以利用函数SetFilePointer来移动文件指针的位置。
执行读取和写入的函数是ReadFile和WriteFile。这两个函数在文件指针位置处读取和写入指定数量的字节数,并不进行格式化数据。下面对这两个函数分别进行介绍。
1)ReadFile
说明:从文件指针位置处读取指定数量的字节数。
原型: BOOL ReadFile(HANDLE hFile, //文件指针
LPVOID lpBuffer, //数据缓冲
DWORD nNumberOfBytesToRead, //读取的字节数
LPDWORD lpNumberOfBytesRead, //接收要读取的字节数
LPOVERLAPPED lpOverlapped //覆盖缓冲)
参数 hFile: 是指向要打开文件的指针。
lpBuffer: 是接收来自文件数据缓冲区的指针。
nNumberOfBytesToRead: 指从文件中读取的字节数。
lpNumberOfBytesRead: 用于接收要读取的字节数。
lpOverlapped: 是指向OVERLAPPED结构的指针,如果hFile所指向的文件是用FILE_FLAG_OVERLAPPED创建的,则需要用到此结构。
返回值:如果函数调用成功则返回值为TRUE,否则为FALSE。
2)WriteFile
说明:此函数是用来向文件指针位置处写入指定数量的字节数。
BOOL WriteFile (HANDLE hFile,
LPCVOID lpBuffer,
DWORD nNumberOfBytesToWrite,
LPDWORD lpNumberOfBytesWritten,
LPOVERLAPPED lpOverlapped);
其参数设置与读取文件函数ReadFile大同小异,只需要将读取改成写入即可,返回值也很相似,在这里就不多介绍了。
3) DeleteFile
说明:此函数用来删除一个已存在并指定路径的文件。
原型: BOOL DeleteFile(LPCTSTR lpFileName);
参数:lpFileName是一个指向字符串的指针,字符串中存储的是包含有具体路径的文件名。
返回值:如果函数调用成功则返回TRUE,否则返回FALSE。
4) CloseHandle
说明:此函数用于关闭目前打开的对象句柄
原型:BOOL CloseHandle(HANDLE hObject);
参数: hObject为对象的句柄。
返回值: 如果函数调用成功则返回TRUE,否则返回FALSE。


你可以通过这个链接引用该篇文章:http://bear5292.bokee.com/tb.b?diaryId=16940944



博客园  ©  2004-2025
浙公网安备 33010602011771号 浙ICP备2021040463号-3