1.绑定窗口时的类型转换
4. 多线程问题
使用COM组件时,通常的做法是在main函数的最前面调用CoInitialize(NULL);,最后面调用CoUninitialize();也就是说:COM的初始化是以线程为单位的。
首先大漠的DLL是COM组件,COM组件使用前须用CoInitialize(NULL); API函数声明一下,此声明是以线程为单位的,也就是说主线程声明了也只是在主线程起作用,如果想在子线程中继续使用COM组件,则需要再用CoInitialize(NULL)以及其后配套API再声明一次。
int away;
HWND wnd;
CString fifteen;
long Di;
wnd=::FindWindow(L"Notepad",NULL);
fifteen.Format(L"%d",wnd);//HWND转CString
Di=_tstol((LPCTSTR)fifteen); //CString转long
away=dm.BindWindow(Di,L"normal",L"normal",L"normal",0);
TRACE(L" 记事本还开着 ");
窗口句柄处的数据类型是Long用FindWindow()API函数获取的窗口句柄是HWND类型,目前能想到的方法就是把HWND类型先转换成CString类型,再把CString类型转为long型。
2.字符串类型选择问题
在MFC工程下字符串类型最好选择CString或者C++的string。此二者相互转换起来比较方便。在想使用string类型需要先导入头文件:
#include <string>
然后可以
using namespace std;
一次性把命名空间中的内容全部导出,这有违命名空间设立的初衷,容易导致混淆,特别是把这句话放入.h头文件后,如果其他.cpp文件也引用此.h文件会出现命名冲突。安全的方法是声明类型时:
std::string pBuff;
这样就声明了一个string类型。
然后用string类型声明一个二维数组用于A星算法作为二维地图
std::string pBuff[11][7] ={
{"0","*","0","0","0","0","0"},
{"0","0","0","0","0","0","0"},
{"0","0","0","0","0","0","0"},
{"0","0","0","0","0","0","0"},
{"0","0","0","0","0","0","0"},
{"0","0","0","0","0","0","0"},
{"0","0","0","0","0","0","0"},
{"0","0","0","0","0","0","0"},
{"0","0","0","0","0","0","0"},
{"0","0","0","0","0","0","0"},
{"0","0","0","0","0","0","0"},
};
然后是string与CString类型之间的转换问题。
string转CString:
CString mistakes;
mistakes=pBuff[0][1].c_str(); //string转CString
CString转string:
CString husband=L"ffaa33";
string action=( CW2A( husband.GetString() ) );
3.怎么判断2个数相除有没有余数
int nub=6;
int nub2=2;
//%取余运算符,如果相除能整除余数为0,不为0就是有余数
if (nub % nub2==0)
{
MessageBox(L"没有余数");
}
else
{
MessageBox(L"有余数");
}
4. 多线程问题
使用COM组件时,通常的做法是在main函数的最前面调用CoInitialize(NULL);,最后面调用CoUninitialize();也就是说:COM的初始化是以线程为单位的。
首先大漠的DLL是COM组件,COM组件使用前须用CoInitialize(NULL); API函数声明一下,此声明是以线程为单位的,也就是说主线程声明了也只是在主线程起作用,如果想在子线程中继续使用COM组件,则需要再用CoInitialize(NULL)以及其后配套API再声明一次。
以下是一个线程的回调函数:
UINT CNeverDlg::Thread1(void *param) //线程1
{
//子线程调用大漠
Cdmsoft things; //声明一个新的大漠对象
CoInitialize(NULL);
CLSID well;
HRESULT wait=CLSIDFromProgID(OLESTR("dm.dmsoft"),&well);
things.CreateDispatch(well);
things.MoveTo(300,400);
CoUninitialize();
return 0; //因为回调函数的类型为UINT而不是void所以需要返回0
}
5.怎么按长度取出字符串
string action,time;
action="ffaa33";
time=action.substr(0,2); //从第0个字开始取2个字放入time变量
//此时time里的数值就是字符串"ff"
6.怎么把字符串转为int
CString forg;
int nValude = 0;
string action,time,family,pass;
action="ffaa33";
family="0x";
time=action.substr(0,2); //从第0个字开始取2个字放入time变量
pass=family+time; //把两个string字符串合起来,此时pass中的值就是:"0xff"
nValude = stoi(pass,nullptr,0); //把string字符串转int,此时nValude变量中存储的就是数字255了
forg.Format(_T("%d"),nValude); //参数1改成%x就会以16进制形式显示
OutputDebugStringW(forg);