那为帮个忙。急
解决方案 »
- 如何在其他項目中如何使用MFC
- 结构体是不是也有封装,继承,多态,那它和结构体的区别是什么?
- Html页面文件中调用OCX控件中带有BSTR参数的函数出错的问题(OCX控件由MFC ActiveX ControlWizard创建)
- CInternetSession与https的问题,讨论实现方法也有分
- 今一天别人给了356分,高兴,散尽可用分
- 我要编一个串口控制设备的程序,碰到一个普遍的问题,想问问大家是怎么处理的。讨论一个好的方法。
- 如何判断一个块new出来的内存是否有效,也就判断是否被delete过?!
- 用InstallShield制作安装盘的问题
- 框架的问题
- 两道高难度题,悬奖300分。急啊!
- 用带地址栏的ie调用正常,用弹出窗口方式就出错,是什么问题
- 提示窗口的创建
unsigned short* b;b = new unsigned short[20];
memcpy(b,a,20);delete []b;
用法:#include <string.h>
功能:把src所指由NULL结束的字符串复制到dest所指的数组中。
说明:src和dest所指内存区域不可以重叠且dest必须有足够的空间来容纳src的字符串。
返回指向dest的指针。
wchar_t wcUserName[MAX_STRLEN];
wchar_t wcPassWord[MAX_STRLEN];
BYTE user[20];
char password[MAX_PATH];
CString pw;
CString compw;
if(bPD_BSAT_OpenDevice())
{
bPD_BSAT_FPInit();
bPD_BSAT_FPGetSecurityLevel(&securitylevel);
securitylevel=PD_BSAT_SECURITY_MID;
bPD_BSAT_FPSetSecurityLevel(securitylevel);
m_userinfo.GetWindowText((char *)user,20);
m_pword.GetWindowText(password,MAX_PATH);
if(strlen((char *)user)==0)
{
m_edit_status.SetWindowText("user name is empty");
}
else if(strlen((char *)user)>=20)
{m_edit_status.SetWindowText("user name is more than 20 byte");} else
{
UI.wcUserName=CharToUnicode(user);
CharToUnicode()是转多字符的函数。
建议用strcpy或者memcpy
或者把类型改成统一的
char *a;
char *b;
或者:
char a[size];
char b[size];
BYTE user[20];
改为 BYTE *user;
user = new BYTE[20];
.....
delete user;
{
// TODO: Add your control notification handler code here
int securitylevel;
int UserIndex=1;
stPD_BSAT_UserInfo UI;
m_abort.ShowWindow(SW_SHOW);
// st_PD_BSAT_FingerInfo FI;
UI.wcUserName;
UI.wcPassWord;
char username[MAX_PATH]; wchar_t wcUserName[MAX_STRLEN];
wchar_t wcPassWord[MAX_STRLEN];
// BYTE user[20];
BYTE* user;
user = new BYTE[20];
char password[MAX_PATH];
CString pw;
CString compw;
if(bPD_BSAT_OpenDevice())
{
bPD_BSAT_FPInit();
bPD_BSAT_FPGetSecurityLevel(&securitylevel);
securitylevel=PD_BSAT_SECURITY_MID;
bPD_BSAT_FPSetSecurityLevel(securitylevel);
m_userinfo.GetWindowText((char *)user,20);
m_pword.GetWindowText(password,MAX_PATH);
if(strlen((char *)user)==0)
{
m_edit_status.SetWindowText("user name is empty");
}
else if(strlen((char *)user)>=20)
{m_edit_status.SetWindowText("user name is more than 20 byte");} else
{
//change(user,(BYTE*)wcUserName,strlen(user));
//unsigned short p[20]=(unsigned short)user;
//wcscpy(wcUserName,user);
UI.wcUserName=CharToUnicode(user);
memset(&UI, 0x00, sizeof(UI));
// InvalidateRect(NULL, TRUE);
// UpdateWindow();
if(bPD_BSAT_FPStartEnrollUser(1, &UI))
{
Enroll();
}
}
}
if(bPD_BSAT_FPGetUserInfo(1, &UI))
{
bPD_BSAT_FPClose();
bPD_BSAT_CloseDevice();
sprintf(username,"%s",UI.wcUserName);
m_userinfo.SetWindowText(username);
m_edit_status.SetWindowText("This finger be enrolled");
// m_userinfo.SetWindowText(UI.wcUserName);
}
}
unsigned short* Add::CharToUnicode(CString str)
{
int n=20;
char szBuf[40];
strncpy(szBuf ,str,n);
szBuf[n] = '\0';
int nAnsiLen=strlen(str);
int nUniLen=MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED,str,nAnsiLen,
NULL,0);
LPWSTR pUnicode=(LPWSTR)LocalAlloc(LPTR,nUniLen);
MultiByteToWideChar(CP_ACP,MB_PRECOMPOSED,str,nAnsiLen,
pUnicode,nUniLen);
ASSERT(pUnicode!=NULL);
LPWSTR pBuf=(LPWSTR)LocalAlloc(LPTR,nUniLen);
wcsncpy(pBuf,pUnicode,n);
BOOL bDefault;
ZeroMemory(&szBuf,40);
WideCharToMultiByte(CP_ACP,WC_COMPOSITECHECK,pBuf, n,
szBuf,40,NULL,&bDefault);
LocalFree(pUnicode);
LocalFree(pBuf);
return 0;
}
1、给CharToUnicode再定义一个参数,用此参数带回返回值,该参数可以定义为指针或数组类型,调用时把UI.wcUserName作为参数传过去。
2、用一个指针变量接收返回值,再用memcpy之类的函数把指针指向的数据复制到数组中。
UI.wcUserName=CharToUnicode(user); //而且 这个类型不匹配一个是数组 一个是指针 不可直接赋值
1、给CharToUnicode再定义一个参数,用此参数带回返回值,该参数可以定义为指针或数组类型,调用时把UI.wcUserName作为参数传过去。
2、用一个指针变量接收返回值,再用memcpy之类的函数把指针指向的数据复制到数组中。那我UI.wcUserName如何获取到数组直呢?
这样的话,程序可以运行,但是会出现该内存不能为READ 的的错误
咋办?
BOOL CharToUnicode(LPCSTR lpcszStr, LPWSTR lpwszStr)
{
DWORD dwSize;
dwSize = MultiByteToWideChar (CP_ACP, 0, lpcszStr, -1, NULL, 0);
MultiByteToWideChar (CP_ACP, 0, lpcszStr, -1, lpwszStr, dwSize);
return TRUE;
}
wchar_t* wstr = new wchar_t[strlen(cstr)+1];
CharToUnicode(cstr,wstr);
{
MultiByteToWideChar(NULL,CP_ACP,source ,-1,dest,len);
}
int main()
{
char source[20] = "test";
wchar_t wText[20];
ToWidechar( source , wText, 20);
wcout << wText << endl;
return 0;
}test
Press any key to continue