ATL与WTL编程点滴...
打开ATL9目录中的atlstdthunk.h文件,可以看到ATL的thunk实现代码全在此。但该文件并不能直接用在其他winsdk工程中:因为__AllocStdCallThunk与__FreeStdCallThunk并没有定义,会导致链接错误。
Tags: , ,
发送进程:
//进程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();
如果函数正常执行,则返回 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  不支持接口
Tags: , ,
这是从ATL7开始新增加的文件操作类,头文件在atlfile.h中。通过对CreateFile和CreateFileMapping的包装,使得针对文件的读写操作更加的简便。今天在写一个批量删词的小工具中用到了这两个类,总结一下。
首先声明全局变量:
CAtlFile m_fileSrc;
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;
}
分页: 1/2 第一页 1 2 下页 最后页 [ 显示模式: 摘要 | 列表 ]