我建一个win32 conloe的空工程,然后,加入新建一个.cpp文件
里边有两个对话框,文件的最上边这样定义:
_bstr_t bsname,bsbarcode,bsoutdate,bsindate,bsgoods,bsreason,bshead,bsbranch;
在一个对话框中:
BOOL CALLBACK WndProcBranch(HWND hwnd,UINT nMsg,WPARAM wParam,LPARAM lParam)
{
HWND hLt;
switch(nMsg)
{
case WM_INITDIALOG:
hLt=GetDlgItem(hwnd,IDC_CBBBRANCH);
...................
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDOK:
bsbranch="";
GetDlgItemText(hwnd,IDC_CBBBRANCH,bsbranch,128);//正常执行,即能把其中的值取出来放进bsbranch里
EndDialog(hwnd,0);
break;
...........................
但在另一个里:
BOOL CheckData()
{
//检查数据填写是否正确
GetDlgItemText(m_mainhwnd,IDC_EDNAME,bsname,128);//外出人员姓名
//其中的m_mainhwnd是主对话的HWND
..................
却无论如何也得不到其中的值,即bsname总是???,迷惘中ing.....
这有什么不同吗?
(前边的是一个listbox,后边的是一个edit)
里边有两个对话框,文件的最上边这样定义:
_bstr_t bsname,bsbarcode,bsoutdate,bsindate,bsgoods,bsreason,bshead,bsbranch;
在一个对话框中:
BOOL CALLBACK WndProcBranch(HWND hwnd,UINT nMsg,WPARAM wParam,LPARAM lParam)
{
HWND hLt;
switch(nMsg)
{
case WM_INITDIALOG:
hLt=GetDlgItem(hwnd,IDC_CBBBRANCH);
...................
case WM_COMMAND:
switch(LOWORD(wParam))
{
case IDOK:
bsbranch="";
GetDlgItemText(hwnd,IDC_CBBBRANCH,bsbranch,128);//正常执行,即能把其中的值取出来放进bsbranch里
EndDialog(hwnd,0);
break;
...........................
但在另一个里:
BOOL CheckData()
{
//检查数据填写是否正确
GetDlgItemText(m_mainhwnd,IDC_EDNAME,bsname,128);//外出人员姓名
//其中的m_mainhwnd是主对话的HWND
..................
却无论如何也得不到其中的值,即bsname总是???,迷惘中ing.....
这有什么不同吗?
(前边的是一个listbox,后边的是一个edit)
BOOL CheckData()
{
//检查数据填写是否正确
if (!GetDlgItemText(m_mainhwnd,IDC_EDNAME,bsname,128)) {
char msg[256]="";
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, 0,
GetLastError(), 0, msg, sizeof(msg), NULL);
MessageBox(GetActiveWindow(), msg, "GetDlgItemText",
MB_OK|MB_ICONERROR);
}
}
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, 0,
GetLastError(), 0, msg, sizeof(msg), NULL);
MessageBox(GetActiveWindow(), msg, "GetDlgItemText",
MB_OK|MB_ICONERROR);
这种写法好像不太正确,这是在sdk中的,这样写后,在编译时出错:
main.cpp(196):error c2664:'FormatMessageW':cannot convert parameter 5 from 'char [256]' to 'unsigned short *'
main.cpp(197):error c2664:'MessageBoxW':cannot convert parameter 2 from 'char [256]' to 'const unsigned short *'
两个错误,我最怕在sdk中数据类型的转变和使用,找不着东西南北
我觉得:CMainFrame *m_mainhwnd=(CMainFrame *)AfxGetMainWnd();GetDlgItemText=(m_mainhwnd->GetDlgItem(IDC_EDNAME),bsname,128);
CMainFrame *m_mainhwnd=(CMainFrame *)AfxGetMainWnd();m_mainhwnd->GetDlgItemText=(IDC_EDNAME,bsname,128);我试了,这样就可以
GetDlgItemText(hWnd,IDC_EDIT1,szEditText1,255);
MessageBox(NULL,(LPCTSTR)szEditText1,(LPCTSTR)"Text",MB_OK);
這樣沒有問題可以取出來啊。
将char msg[256]="";改为TCHAR msg[256]="";
后,又多了一个错误:
cann't convert from 'char [1]' to 'unsigned short [256]'2.
CMainFrame *m_mainhwnd=(CMainFrame *)AfxGetMainWnd();m_mainhwnd->GetDlgItemText=(IDC_EDNAME,bsname,128);
但我用的是一个对话框,sdk,根本就没有存在类CMainFrame,在类浏览器里,只有一个Globals3.
char szEditText1[255];
GetDlgItemText(hWnd,IDC_EDIT1,szEditText1,255);
我这样写后,错误:
cannot convert parameter 3 from 'char [256' to 'unsigned short *'
=============================
注意:这里是sdk下的编程
请大家再看一看
if (!GetDlgItemText(m_mainhwnd,IDC_EDNAME,bsname,128)) {
char msg[256]="";
FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM, 0,
GetLastError(), 0, msg, sizeof(msg), NULL);
MessageBox(GetActiveWindow(), msg, "GetDlgItemText",
MB_OK|MB_ICONERROR);
我那样写的结果是:
error C2664: 'FormatMessageW' : cannot convert parameter 5 from 'char [255]' to 'unsigned short *'
error C2664: 'MessageBoxW' : cannot convert parameter 2 from 'char [255]' to 'const unsigned short *'
也不知道为啥就我的不行,充气中ing....
char errbuf[256]
char modulename[MAX_PATH]
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
GetLastError(),
LANG_NEUTRAL,
(LPSTR)&lpBuffer,
0,
NULL);
wsprintf(errbuf,"\nThe following call failed! Reason:%s\n",lpBuffer);
GetModuleFileName(NULL,modulename,MAX_PATH);
MessageBox(NULL,errbuf,modulename,MB_OK);
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
GetLastError(),
LANG_NEUTRAL,
(LPTSTR)&lpBuffer,
0,
NULL);
: error C2664: 'wsprintfW' : cannot convert parameter 1 from 'char [256]' to 'unsigned short *'
: error C2664: 'GetModuleFileNameW' : cannot convert parameter 2 from 'char [260]' to 'unsigned short *'
: error C2664: 'MessageBoxW' : cannot convert parameter 2 from 'char [256]' to 'const unsigned short *'
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
GetLastError(),
LANG_NEUTRAL,
(LPSTR)&lpBuffer,
0,
NULL);
wsprintf(errbuf,"\nThe following call failed! Reason:%s\n",lpBuffer);
GetModuleFileName(NULL,modulename,MAX_PATH);
MessageBox(NULL,lpBuffer,"Message",MB_OK);
LPSTR lpBuffer;
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
GetLastError(),
LANG_NEUTRAL,
(LPSTR)&lpBuffer,
0,
NULL);
MessageBox(NULL,lpBuffer,"Message",MB_OK);
TCHAR[256]
LPTSTR, LPCTSTR
_TEXT("test")
_tprintf, _stprintf, _tcscpy
这样最终你用不用Unicode都不要紧,宏会自动查找对应的类型/函数的
最忌讳的就是一会用Unicode, 一会又不用
TCHAR errbuf[256] = {0};
TCHAR modulename[MAX_PATH] = {0};
FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM,
NULL,
GetLastError(),
LANG_NEUTRAL,
lpBuffer,
0,
NULL);
_stprintf(errbuf,"\nThe following call failed! Reason:%s\n",lpBuffer);
GetModuleFileName(NULL,modulename,MAX_PATH);
MessageBox(NULL,errbuf,modulename,MB_OK);
看起来楼主使用的是Unicode版本..因为我使用(LPTSTR)强制转型没有出错..FormatMessage是可以自动配置所需内存.我们不用担心缓冲区饱和的问题..因此楼主就应该可以把错误信息印出来..MessageBox(NULL,(LPTSTR)lpBuffer,"Message",MB_OK)...因为我也经常使用SDK编写..你的问题我从未遇到过..很奇怪..
用GetWindowText是不能提取edit中的文本的。
对于edit文本的提取要用消息来解决:
SendMessage或者PostMessage,发送的消息是WM_GETTEXT
靠,就我这里,哪次都出错,我是把上边的代码(老农民的)copy过来的搞地头昏脑涨,也摸不着东西南北
这些小东东,不是问题,就是不会,搞不正确,不像个学习的样子不过,还得努力中ing....
寻找答案中ing....
edit 可以用GetWindowText取得的,请你看一下GetWindowText的详细,详细资料,她就是通过发送WM_GETTEXT来实现的
好多天了,都不敢在经理面前说话苦恼
LPTSTR lpOut, // pointer to buffer for output
LPCTSTR lpFmt, // pointer to format-control string
... // optional arguments
);Unicode: Implemented as Unicode and ANSI versions on Windows NT.
你的这一句里怎么是_sprintf ?
: error C2065: '_sprintf' : undeclared identifier右键点一下,go to difinition, 如果能找到,那就是 TCHAR.h 头文件没包含
如果找不到,那就是你拼写错了,看清楚是_stprintf
一样
http://www.orchidheart.com/tech/problem/index.asp?nw=yes中的第一个问题(标号为4),或者,直接用:
http://www.orchidheart.com/tect/problem/source/sqltest.rar
其中,注释最多的地方,就是出错的地方(CheckData函数)谢谢大家的帮助
http://www.orchidheart.com/tech/problem/source/sqltest.rar
int iLen=200;
_bstr_t bs;
GetDlgItemText(...,szC,iLen);
bs=szC;就这样可以了,
峰回路转时