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
{
// 这是文件
}
}
}