一直在加班搞这个该死的东东,头晕脑胀。把网上所有的方法都尝试了一遍之后还是不行,于是只能“致富靠双手,要爽由自己”了
言归正传
步骤1 下载zbar for windows
地址
http://sourceforge.jp/projects/sfnet_zbarw/
步骤2 安装zbar
选定一个指定路径进行安装,最好是纯英文的路径,中文的也能实现,但不知道会遇到什么未知的问题
安装好后在指定的路径应该能找到这样一个文件夹ZBAR,里面的内容如下:
步骤 3
在程序中通过system函数调用bin文件中的zbarimg.EXE,实现二维码解析功能
程序如下:
system("D:\\ZBar\\bin\\zbarimg.exe D:\\qrcodeimg\\GH1.bmp>C:\\2.txt");
注2
"D:\\ZBar\\bin\\zbarimg.exe为zbarimg.EXE的绝对路径
注3
D:\\qrcodeimg\\GH1.bmp为需要解析的二维码图片
注4
>C:\\2.txt 是
将二维码解析结果写入一个txt文档中,后续使用
步骤4: 解析txt文档
将txt文档中的内容根据分隔符进行解析,返回CStringArray类型的对象
//根据指定字符分割字符串函数
CStringArray* QRDecode::DivString(CString test)
{
CStringArray* m_result = new CStringArray;
while(TRUE)
{
int index = test.Find(_T("|"));
if(index == -1)
{
m_result->Add(test);
return m_result;
}
CString test1 = test.Left(index);
m_result->Add(test1);
test = test.Right(test.GetLength()-index-1);
}
}
/根据文件路径获取字符串功能函数
CStringArray* QRDecode::GetQRData()
{
CFile file;
file.Open("C:\\2.txt",CFile::modeRead); //打开文件,具体路径你自己的
char szBuff[1000] = "";
file.Read(szBuff,500); //从文件中读500个字节的东西,读多少自己来
CString str = szBuff; //这个就是你要的东西了.
CStringArray *arr;
arr = DivString(str);
file.Close(); //用完记得关闭文件.
return arr;
}
步骤5 显示到界面上
CStringArray *arr;
arr = m_qrdecode->GetQRData();
m_qrcode.SetWindowText(arr->GetAt(0));
m_qrcode2.SetWindowText(arr->GetAt(1));
m_qrcode3.SetWindowText(arr->GetAt(2));
m_qrcode4.SetWindowText(arr->GetAt(3));
m_qrcode5.SetWindowText(arr->GetAt(4));
m_qrcode6.SetWindowText(arr->GetAt(5));
m_qrcode7.SetWindowText(arr->GetAt(6));
注,这里调用dos命令窗口会显示一个黑框,去掉黑框的方法就是创建一个函数,使用creatProcess方法替代system方法
/替代函数如下
BOOL QRDecode::system_hide(char *CommandLine)
{
SECURITY_ATTRIBUTES sa;
HANDLE hRead,hWrite;
sa.nLength = sizeof(SECURITY_ATTRIBUTES);
sa.lpSecurityDescriptor = NULL;
sa.bInheritHandle = TRUE;
if (!CreatePipe(&hRead,&hWrite,&sa,0))
{
return FALSE;
}
STARTUPINFO si;
PROCESS_INFORMATION pi;
si.cb = sizeof(STARTUPINFO);
GetStartupInfo(&si);
si.hStdError = hWrite;
si.hStdOutput = hWrite;
si.wShowWindow = SW_HIDE;
si.dwFlags = STARTF_USESHOWWINDOW | STARTF_USESTDHANDLES;
//关键步骤,CreateProcess函数参数意义请查阅MSDN
if (!CreateProcess(NULL, CommandLine, NULL,NULL,TRUE,NULL,NULL,NULL,&si,&pi))
{
return FALSE;
}
CloseHandle(hWrite);
char buffer[4096] = {0};
DWORD bytesRead;
while(true)
{
memset(buffer,0,strlen(buffer));
if(ReadFile(hRead,buffer,4095,&bytesRead,NULL)==NULL)
break;
//buffer中就是执行的结果,可以保存到文本,也可以直接输出
//printf(buffer);//这行注释掉就可以了
Sleep(100);
}
return TRUE;
}
///调用如下
system_hide("D:\\ZBar\\bin\\zbarimg.exe D:\\qrcodeimg\\GH1.bmp>C:\\2.txt");
工程文件可以在csdn下载,具体链接如下:
http://download.csdn.net/detail/u011671760/6297229
就要了一分,请兄弟们支持一下。我也是下载了很多工程才搞定的。