杂乱笔记

1. CString  转 LPTSTR

   CString  str;

   str.Format(_T("this is test"));

   LPTSTR ptstr =  (LPTSTR)(LPCTSTR)str ;

2. WCHAR * 与 CHAR *转换

     本专栏有对应的文章

3.  我还以为 VC 项目设置UNICODE字符集是通过宏来设置更改,后来才发现在 项目属性中可以简单的设置即可更改。总用双字符的属性写项目了, 这次给 delphi 给底层代码还是和伙伴统一用多字符集方便些。因为我好多要用 C的函数来完成,害得我还写了2 个WCHAR* 与 CHAR* 的互转函数。

4. 监控项目犯了个错误:

以为 CFile 设置了 CFile::modeRead  | CFile::modeWrite 就是设置读写标志了,后来发现出错了,很奇怪。看了文档才明白 这2个不能 combine ,CFile::modeRead   就是只能读, CFile::modeWrite 就是只能写。要是想读写 要设置CFile::modeReadWrite ,这个错误费了我大概 29 分钟。 

5. 程序自动升级方法------------------------------------------------------------

xx 

你好。。。
fish 13:44:59
你好
fish 13:46:03
工作怎么样呀

今天把公司的差使给交了...

fish 13:47:07
呵呵 这下可以好好放松一下了

版本更新你有什么高见么?
fish 13:47:41
 你说是程序升级吗

fish 13:47:56
我现在正在做呢
fish 13:48:17
是升级客户端吗
xx 13:48:34
我是这样做的...
xx  13:49:17
有三方:网内服务器,客户机,远程IIS服务器
xx  13:49:54
版本信息写死在程序里,版本信息由IIS方提供...
xx  13:50:29
如果发现新的版本,就到网内指定的地址下载(HTTP)下载
xx  13:50:57
要是网内服务器没开,就在远程IIS服务器下载(HTTP)
xx  13:51:53
现在的问题是:下下来如何将旧的版本删除运行型的版本?
fish 13:52:12
2 个程序:
xx  13:52:14
因为只有一个EXE文件....
fish 13:52:43
一个接收版本信息,发现有更新版本时,创建另外一个升级程序
fish 13:52:52
然后自己退出
fish 13:53:13
升级程序接收服务器的压缩包,然后再本地解压
fish 13:53:32
把原先文件替换后,在启动它 ,然后自己再退出
xx  13:53:38
那如果就用一个EXE能做到么?
fish 13:53:40
这就行了
xx  13:54:17
如果客户端就是一个EXE文件,,这样怎么实现?
fish 13:55:27
你看瑞星,QQ等 都是有好几个程序。
如果就一个 把自己本身覆盖可以,但其他 DLL 可能不行 。 我知道 exe 运行时 改名是没有问题的
fish 13:56:14
想了个方法
xx  13:56:20
我的程序很小,只是一个EXE,没有dll文件
fish 13:57:36
那可以了
你试验一下 程序运行时自己改名,然后接收服务器文件到当前目录下,启动它,然后当前运行的程序退出
fish 13:57:53
这就可以替换了
xx  13:59:42
嗯,好像能解决问题了.^_^
xx  14:00:23
对了,你的那个项目还交了么?
fish 14:01:34
没有,现在正有一个视频传输的内存错误,
调试了半天,从网上下的源码
fish 14:02:45
这个代码用的是 vfw 库做的 以前没有接触过,可能是 divx 编码器选的有问题
xx 14:03:06
 调试最头疼了...
xx 14:03:52
现在就把升级搞好就OK了....谢谢你
fish 14:04:34
调试可以快速的发现问题,做底层是必须的
没关系,多联系,

4. 设置热键 hotkey

 /*
  * 设置窗口的 HotKey
  */ 
 ATOM id = GlobalAddAtom("#Client");
 if (FALSE == RegisterHotKey ( this->GetSafeHwnd(), id, MOD_SHIFT|MOD_ALT,'Z' ))
 {
  AfxMessageBox (_T("FALSE == RegisterHotKey"));
 }

还需要手动添加 WM_HOTKEY 的消息响应函数,在函数中
LRESULT CXxxDlg::OnHotkey ( WPARAM wParam, LPARAM lParam )
{
 if ( (LOWORD(lParam ) == MOD_SHIFT|MOD_ALT) && HIWORD(lParam ) == 'Z')
 {
  // 我们设置的特定热键 Shift+Alt+'Z', 处理某些事务
 }
}

VC 给delphi提供DLL 可能出错的原因
1. 传参数出错
 delphi 不能用本身的 String 类型来给 VC 的 CHAR * 类型传参数
 delphi 必须自己分配一个指向特定大小内存的指针,赋值后传递指针

 2. VC提供的函数执行结束后出错
  很可能是调用约定不一致造成的, delphi 默认的是 stdcall ,VC提供的函数也应该是 __stdcall
  如果不一致会导致函数退出时返回地址错误,从而引发异常。

3. 函数在初始化时出错
 用 MFC 给 delphi 写函数。MFC 中明确说明是 如果MFC是以共享形式提供的 DLL,必须加上
 AFX_MANAGE_STATE(AfxGetStaticModuleState()); 位置是最靠前甚至前面不能有变量。
 所以最好还是以静态方式连接

隐藏任务栏窗口
DWORD    Style    =    ::GetWindowLong(AfxGetMainWnd()->m_hWnd,GWL_EXSTYLE);  
Style    =   WS_EX_TOOLWINDOW    ;  
AfxGetMainWnd()->ShowWindow(FALSE);  
::SetWindowLong(AfxGetMainWnd()->m_hWnd,GWL_EXSTYLE,Style);    
AfxGetMainWnd()->ShowWindow(TRUE); 

得到命令行参数: 

GetCommandLine(void)


遍历指定的目录

void fun()

 // 构建在 C://test//* 目录下查找 
 hFile = FindFirstFile( L"C://test//*", (LPWIN32_FIND_DATAW)&fd );
 
 if (hFile == INVALID_HANDLE_VALUE )
 {
  return ;
 }
 
 while( FindNextFile(hFile , (LPWIN32_FIND_DATAW)&fd) )
 {
  if ( (fd.dwFileAttributes & FILE_ATTRIBUTE_DIRECTORY) &&
     wcsicmp(fd.cFileName, L".") !=0 &&
     wcsicmp(fd.cFileName, L"..")!=0 )
  {
   // fd.cFileName 普通目录

  }else if ( wcsicmp (fd.cFileName, L".") != 0 &&
          wcsicmp (fd.cFileName, L"..") != 0  )
  {
   //"." ,表示当前目录, "..",表示上级目录
  }else
  {
   // 这是文件
  }      
 }
}

你可能感兴趣的:(服务器,mfc,dll,exe,IIS,Delphi)