ATL与WTL编程点滴...
打开ATL9目录中的atlstdthunk.h文件,可以看到ATL的thunk实现代码全在此。但该文件并不能直接用在其他winsdk工程中:因为__AllocStdCallThunk与__FreeStdCallThunk并没有定义,会导致链接错误。
发送进程:
//进程B的接收数据窗口对象
HWND hWndReceived = FindWindow(_T("QuickMSDN - QPSOFT.COM"), NULL);
//需要传递的数据
CString strDataToSend = lpstrCmdLine;
//COPYDATASTRUCT结构是WM_COPYDATA传递的数据结构对象
COPYDATASTRUCT cpd;
cpd.dwData = 0;
//传递的数据长度
cpd.cbData = (strDataToSend.GetLength() + 1) * sizeof(TCHAR);
//传递的数据地址
cpd.lpData = (void*)strDataToSend.GetBuffer(cpd.cbData);
SendMessage(hWndReceived, WM_COPYDATA, 0, (LPARAM)&cpd);
strDataToSend.ReleaseBuffer();
HWND hWndReceived = FindWindow(_T("QuickMSDN - QPSOFT.COM"), NULL);
//需要传递的数据
CString strDataToSend = lpstrCmdLine;
//COPYDATASTRUCT结构是WM_COPYDATA传递的数据结构对象
COPYDATASTRUCT cpd;
cpd.dwData = 0;
//传递的数据长度
cpd.cbData = (strDataToSend.GetLength() + 1) * sizeof(TCHAR);
//传递的数据地址
cpd.lpData = (void*)strDataToSend.GetBuffer(cpd.cbData);
SendMessage(hWndReceived, WM_COPYDATA, 0, (LPARAM)&cpd);
strDataToSend.ReleaseBuffer();
如果函数正常执行,则返回 S_OK,同时真正的函数运行结果则通过参数指针返回。如果遇到了异常情况,则COM系统经过判断,会返回相应的错误值。
HRESULT 值 含义
S_OK 0x00000000 成功
S_FALSE 0x00000001 函数成功执行完成,但返回时出现错误
E_INVALIDARG 0x80070057 参数有错误
E_OUTOFMEMORY 0x8007000E 内存申请错误
E_UNEXPECTED 0x8000FFFF 未知的异常
E_NOTIMPL 0x80004001 未实现功能
E_FAIL 0x80004005 没有详细说明的错误。一般需要取得 Rich Error 错误信息(注1)
E_POINTER 0x80004003 无效的指针
E_HANDLE 0x80070006 无效的句柄
E_ABORT 0x80004004 终止操作
E_ACCESSDENIED 0x80070005 访问被拒绝
E_NOINTERFACE 0x80004002 不支持接口
S_OK 0x00000000 成功
S_FALSE 0x00000001 函数成功执行完成,但返回时出现错误
E_INVALIDARG 0x80070057 参数有错误
E_OUTOFMEMORY 0x8007000E 内存申请错误
E_UNEXPECTED 0x8000FFFF 未知的异常
E_NOTIMPL 0x80004001 未实现功能
E_FAIL 0x80004005 没有详细说明的错误。一般需要取得 Rich Error 错误信息(注1)
E_POINTER 0x80004003 无效的指针
E_HANDLE 0x80070006 无效的句柄
E_ABORT 0x80004004 终止操作
E_ACCESSDENIED 0x80070005 访问被拒绝
E_NOINTERFACE 0x80004002 不支持接口
这是从ATL7开始新增加的文件操作类,头文件在atlfile.h中。通过对CreateFile和CreateFileMapping的包装,使得针对文件的读写操作更加的简便。今天在写一个批量删词的小工具中用到了这两个类,总结一下。
首先声明全局变量:
CAtlFileMapping是一个简单的模板类,目的是确定指针是否宽字符。用char即可,因为自己可以通过filemap.GetData()来强制转换。
声明全局变量的目的是:由于要将相应操作放在一个线程中,而线程可以让用户强制杀死,全局变量可以在强制杀死线程后清理数据。
首先声明全局变量:
CAtlFile m_fileSrc;
CAtlFileMapping<char> m_fmSrc;
CAtlFile m_fileDel;
CAtlFileMapping<char> m_fmDel;
CAtlFileMapping<char> m_fmSrc;
CAtlFile m_fileDel;
CAtlFileMapping<char> m_fmDel;
CAtlFileMapping是一个简单的模板类,目的是确定指针是否宽字符。用char即可,因为自己可以通过filemap.GetData()来强制转换。
声明全局变量的目的是:由于要将相应操作放在一个线程中,而线程可以让用户强制杀死,全局变量可以在强制杀死线程后清理数据。
#define MAX_COUNT 1000000
int _tmain(int argc, _TCHAR* argv[])
{
CString str;
GetModuleFileName(NULL, str.GetBuffer(MAX_PATH), MAX_PATH);
str.ReleaseBuffer();
DWORD t = GetTickCount();
for (int i = 0; i < MAX_COUNT; ++i)
{
PathRenameExtension((PTSTR)(PCTSTR)str, _T(".ini"));
}
std::cout << GetTickCount() - t << std::endl;
t = GetTickCount();
for (int i = 0; i < MAX_COUNT; ++i)
{
str = str.Left(str.ReverseFind(_T('.'))) + _T(".exe");
}
std::cout << GetTickCount() - t << std::endl;
return 0;
}
int _tmain(int argc, _TCHAR* argv[])
{
CString str;
GetModuleFileName(NULL, str.GetBuffer(MAX_PATH), MAX_PATH);
str.ReleaseBuffer();
DWORD t = GetTickCount();
for (int i = 0; i < MAX_COUNT; ++i)
{
PathRenameExtension((PTSTR)(PCTSTR)str, _T(".ini"));
}
std::cout << GetTickCount() - t << std::endl;
t = GetTickCount();
for (int i = 0; i < MAX_COUNT; ++i)
{
str = str.Left(str.ReverseFind(_T('.'))) + _T(".exe");
}
std::cout << GetTickCount() - t << std::endl;
return 0;
}




2008/10/26

