现在的位置: 首页 > 综合 > 正文

Win32+API 知识积累

2012年09月19日 ⁄ 综合 ⁄ 共 4303字 ⁄ 字号 评论关闭

3.分析"...,...,..."类型的句子:
char *next_token,*token;
char seps[]   = " ,/t/n";
char string1[] ="A string/tof ,,tokens/nand some  more tokens";
char *token1=strtok_s( string1, seps, &next_token1);
while ((token1 != NULL))
{// Get next token:
 if (token1 != NULL)
        {
            printf( " %s/n", token1 );
            token1 = strtok_s( NULL, seps, &next_token1);
        }
}
4."c://123//a.exe"
wchar_t* pEnd=wcsrchr(wcFileName,wcDot);
if(pEnd!=NULL) *pEnd=wcNull;

5.a.导出到硬盘中
void CLDRCapUI::OutputToDisk(CString strRoot)
{
 DWORD dwAttrs = GetFileAttributes(strRoot);
 if (dwAttrs==INVALID_FILE_ATTRIBUTES)
 {
  AfxMessageBox(_T("没有找到I盘"));
  return;
 }

 char cMovie[256]={0};
 char cPhoto[256]={0};
 char cTo[256]={0};
 ::sprintf(cMovie,"%s",thePrefs.GetMovieHome());
 ::sprintf(cPhoto,"%s",thePrefs.GetPhotoHome());
 ::sprintf(cTo,"%sLRCap",strRoot);
 char  strTitle[] = "文件正在拷贝...";    //进度条标题
 //如果没有发现该文件夹则创建此文件夹
 CFileFind finder;
 BOOL bFileFind= finder.FindFile(cTo);
 if(!bFileFind)
  CreateDirectory(cTo,NULL); 

 //将图片信息从数据库下到硬盘中
 int iRepositoryType=thePrefs.GetRepositoryType();
 if(0==iRepositoryType)//数据库存储
  ExportProcessedRecord(cPhoto);
 
 SHFILEOPSTRUCT   sfo;  
 sfo.hwnd   =   NULL;  
 sfo.wFunc   =   FO_COPY;
 sfo.pFrom   =cMovie;
 sfo.pTo   = cTo; 
 sfo.fFlags   =   /*FOF_SILENT*/   FOF_ALLOWUNDO|   FOF_NOCONFIRMATION   |   FOF_NOCONFIRMMKDIR;  
 sfo.hNameMappings = NULL;
    sfo.lpszProgressTitle = strTitle;

 int hr   =   SHFileOperation(&sfo); 
 if(hr!=0)
 {
  AfxMessageBox(_T("导出影片失败"));
  return;
 }

 sfo.pFrom   =cPhoto;
 hr   =   SHFileOperation(&sfo); 
 if(hr!=0)
 {
  AfxMessageBox(_T("导出影片成功,但是导出图片失败"));
  return;
 }
 AfxMessageBox(_T("导出成功"));
}
b.
拷贝多个
比如在C盘上我有三个目录和三个文件,能否  
  用该函数一下子copy到d盘上去,是否还有其他  
  方法?

char     pFrom[1024];  
  char   *pNextBuf;  
  memset(pFrom,   0x00,   1024);  
  pNextBuf   =   pFrom  
  strcpy(pNextBuf,   "C://autoexec.bat");   //   第一个文件  
  pNextBuf   +=   strlen(pNextBuf)+1;   //   空出一个字符'/0'  
  strcpy(pNextBuf,   "c://winnt//hh.exe");   //   下一个文件  
  pNextBuf   +=   strlen(pNextBuf)+1;   //   空出一个字符'/0'  
  因为pFrom中的所有字符在开始时已全置为0,所以它肯定是以两个'/0'字符结尾的
6.一次只运行一个程序实例
下列两种方式都可以实现,建议采用第二种方式:
1、 if( FindWindow(NULL,"程序标题"))
         exit(0);
2、BOOL CDemoTBarEApp::InstanceIsRun()
{
 HANDLE m_hMutex;
 m_hMutex = ::CreateMutex(NULL, TRUE, _T("YourApplication"));
 ASSERT(m_hMutex);
 if (GetLastError() == ERROR_ALREADY_EXISTS)
 {
  m_hMutex = NULL;
  return TRUE;//实例已经运行
 }
 return FALSE;//实例未运行
}
7.怎样删除文件到回收站中
 要删除文件到回收站,很简单。只要用SHFileOperation函数就行了,下面的代码我将为你演示了这一个函数的用法。当然你可以直接拷贝到你的项目中。
//删除文件到回收站中
//pszPath  : 待删除的全路径文件名
//bDelete  : TRUE 删除,不移到回收站,FALSE:移到回收站
一、 //返回    : TRUE 删除成功     FALSE 删除失败
BOOL CDelFileToRecycleDlg::Recycle(LPCTSTR pszPath, BOOL bDelete/*=FALSE*/)
{
 SHFILEOPSTRUCT  shDelFile;
 memset(&shDelFile,0,sizeof(SHFILEOPSTRUCT));
 shDelFile.fFlags |= FOF_SILENT;      // don't report progress
 shDelFile.fFlags |= FOF_NOERRORUI;     // don't report errors
 shDelFile.fFlags |= FOF_NOCONFIRMATION;    // don't confirm delete
 // Copy pathname to double-NULL-terminated string.
 //
 TCHAR buf[_MAX_PATH + 1]; // allow one more character
 _tcscpy(buf, pszPath);   // copy caller's pathname
 buf[_tcslen(buf)+1]=0;   // need two NULLs at end

 // Set SHFILEOPSTRUCT params for delete operation
 shDelFile.wFunc = FO_DELETE;       // REQUIRED: delete operation
 shDelFile.pFrom = buf;         // REQUIRED: which file(s)
 shDelFile.pTo = NULL;          // MUST be NULL
 if (bDelete)
 {         // if delete requested..
  shDelFile.fFlags &= ~FOF_ALLOWUNDO;    // ..don't use Recycle Bin
 }
 else
 {           // otherwise..
  shDelFile.fFlags |= FOF_ALLOWUNDO;    // ..send to Recycle Bin
 }
     return SHFileOperation(&shDelFile);    // do it!
}

8.、内存泄漏检查
    也许你已经知道,在C++和C语言中指针问题也就是内存申请与释放是一个令人头疼的事情,假如你申请了内存,但没有释放,并且你的程序需要长时间地运行,那么,系统的资源将逐渐减少,当系统的资源全部被用完时,系统将会崩溃。所以在开发程序的过程中一定要保证资源的完全释放。下面我们来介绍内存漏洞的检查。
示例如下:
// do your memory allocations and deallocations...
 CString s = "This is a frame variable";
#ifdef _DEBUG
 CMemoryState oldMemState, newMemState, diffMemState;
 oldMemState.Checkpoint();
#endif
 // the next object is a heap object
 CString* p = new CString( "Smith  Alan  581_0215" );
 delete p;
 p=NULL;
#ifdef _DEBUG
 newMemState.Checkpoint();
 BOOL b=diffMemState.Difference(oldMemState, newMemState);
 if (b)
 {
  AfxMessageBox( "Memory leaked!/n" );
 }
#endif
    根据试验,由于我们无法释放掉象int CString char 申请的变量。只能释放指针型的变量。而检测内存时,照样会出现内存泄漏现象。所以,这种内存检测方式局限性还是很大。因为我们无法释放非指针型变量。

 

获取浮点型的值
ceil(a)>=a
floor(a)<=a
 
9、将string类型转化为浮点型
double wcstod( const wchar_t *nptr, wchar_t **endptr );
将string类型转化为浮点型
long strtol( const char *nptr, char **endptr, int base );
转化char类型为long,返回nptr的数据
若越界则取边界值:如int则为:[-2147483648,2147483647]
 
10、获取浮点型的整数值
ceil(a)>=a
floor(a)<=a

抱歉!评论已关闭.