我建一个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)

解决方案 »

  1.   

    上边最后一句错了,应该是前边是combobox,后一个是edit
      

  2.   

    可能你的IDC_EDNAME父窗体不是m_mainwnd,
      

  3.   

    我调试了一下,到那里的时候,m_mainhwnd有值,而不是0,也不是NULL,
      

  4.   

    后来,我干脆就在那个窗体的程序(WndMainProc)里写,也不行,不知道究竟是为什么?感觉好奇怪
      

  5.   

    你用FormatMessage取得错误信息,然后显示出来看看。
    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);
        }
    }
      

  6.   

    char msg[256]="";
            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中数据类型的转变和使用,找不着东西南北
      

  7.   


    我觉得:CMainFrame *m_mainhwnd=(CMainFrame *)AfxGetMainWnd();GetDlgItemText=(m_mainhwnd->GetDlgItem(IDC_EDNAME),bsname,128);
      

  8.   

    你用的是UNICODE版本的函数,将char msg[256]="";改为TCHAR msg[256]="";
      

  9.   


    CMainFrame *m_mainhwnd=(CMainFrame *)AfxGetMainWnd();m_mainhwnd->GetDlgItemText=(IDC_EDNAME,bsname,128);我试了,这样就可以
      

  10.   

    char szEditText1[255];
    GetDlgItemText(hWnd,IDC_EDIT1,szEditText1,255);
    MessageBox(NULL,(LPCTSTR)szEditText1,(LPCTSTR)"Text",MB_OK);
    這樣沒有問題可以取出來啊。
      

  11.   

    1.
    将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下的编程
    请大家再看一看
      

  12.   

    问题解决了吗?看来没我的事了,我现在一直用SDK,有空直接交流
      

  13.   


        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);
      

  14.   

    to  wuzhiy(乌贼鱼):
    我那样写的结果是:
    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....
      

  15.   

    LPSTR lpBuffer;
      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);
      

  16.   

    更正:
       FormatMessage(FORMAT_MESSAGE_ALLOCATE_BUFFER|FORMAT_MESSAGE_FROM_SYSTEM,
                   NULL,
                   GetLastError(),
                   LANG_NEUTRAL,
                   (LPTSTR)&lpBuffer,
                   0,
                   NULL);
      

  17.   

    还是错:有三
    : 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 *'
      

  18.   

    这样问题就容易解决了..其实最大的问题在于FormatMessage..不出错就行了LPSTR lpBuffer;
    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);
      

  19.   

    更正:
        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);
      

  20.   

    一点建议,不管是不是用Unicode,定义字符串之类的东西时,一律用T的宏,不要直接指定
    TCHAR[256]
    LPTSTR, LPCTSTR
    _TEXT("test")
    _tprintf, _stprintf, _tcscpy
    这样最终你用不用Unicode都不要紧,宏会自动查找对应的类型/函数的
    最忌讳的就是一会用Unicode, 一会又不用
      

  21.   

    拜托,你这个应该这样写LPTSTR lpBuffer;
    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);
      

  22.   

    同意 kingtsui(老农民)
     看起来楼主使用的是Unicode版本..因为我使用(LPTSTR)强制转型没有出错..FormatMessage是可以自动配置所需内存.我们不用担心缓冲区饱和的问题..因此楼主就应该可以把错误信息印出来..MessageBox(NULL,(LPTSTR)lpBuffer,"Message",MB_OK)...因为我也经常使用SDK编写..你的问题我从未遇到过..很奇怪..
      

  23.   

    先用GetDlgItem取Edit的hWnd,看看有没有问题,没问题的话再用GetWindowText取text,分两步走,可以缩小范围
      

  24.   

    GetWindowText?
    用GetWindowText是不能提取edit中的文本的。
    对于edit文本的提取要用消息来解决:
    SendMessage或者PostMessage,发送的消息是WM_GETTEXT
      

  25.   

    : error C2065: '_sprintf' : undeclared identifier
    靠,就我这里,哪次都出错,我是把上边的代码(老农民的)copy过来的搞地头昏脑涨,也摸不着东西南北
    这些小东东,不是问题,就是不会,搞不正确,不像个学习的样子不过,还得努力中ing....
    寻找答案中ing....
      

  26.   

    _stprintf,不是_sprintf, 中减少了一个tto: Accelerator(自由落体) 
    edit 可以用GetWindowText取得的,请你看一下GetWindowText的详细,详细资料,她就是通过发送WM_GETTEXT来实现的
      

  27.   

    本来就是_stprintf呀,没错的,不过编译不过去,好生奇怪edit可以用GetWindowText我把问题再整理一下,放在网上,你们可以下载,具体看一看是怎么回事,
    好多天了,都不敢在经理面前说话苦恼
      

  28.   

    wsprintf你干吗不用???我真是无话可说。。你不知道这个函数是更实用的吗??看看MSDN。。int wsprintf(
      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.
      

  29.   

    wsprintf是API, _stprintf是C运行库to:zszj
    你的这一句里怎么是_sprintf ?
    : error C2065: '_sprintf' : undeclared identifier右键点一下,go to difinition, 如果能找到,那就是 TCHAR.h 头文件没包含
    如果找不到,那就是你拼写错了,看清楚是_stprintf
      

  30.   

    : error C2065: '_stprintf' : undeclared identifier
    一样
    http://www.orchidheart.com/tech/problem/index.asp?nw=yes中的第一个问题(标号为4),或者,直接用:
    http://www.orchidheart.com/tect/problem/source/sqltest.rar
    其中,注释最多的地方,就是出错的地方(CheckData函数)谢谢大家的帮助
      

  31.   

    以上的第二个网址错误,应该是tech:
    http://www.orchidheart.com/tech/problem/source/sqltest.rar
      

  32.   

    好了,关于这个问题好了,奇怪TCHAR szC[200];
    int iLen=200;
    _bstr_t bs;
    GetDlgItemText(...,szC,iLen);
    bs=szC;就这样可以了,
    峰回路转时