user-0 提问: 为什么C语言的字符串处理这么难呢- -

回复:
user: user-1
content: 像这种错误，首先语法或用法本身就有错误问题上面已经列出来了。 如果确保用法或语法没有错误，那就多判断返回值，看看到底是哪一步出错了。HWND subwindow = CreateEdit(TEXT("我爱C语言"),10,10,150,20,hwnd,(HMENU)4); if (subwindow != NULL) {     int length = GetWindowTextLength(subwindow);     if (length++ > 0) {         TCHAR *edittext = calloc(length, sizeof(TCHAR));         GetWindowText(subwindow, edittext);         MessageBox(hwnd,edittext, TEXT("提示"),NULL);     } }从上到下一溜写下来，谁知道那里出错了。

user: user-2
content: 18楼说的正确，你把你的subwindow设为一个全局看看   你这些WIN32的程序还用calloc啊，而且还用错了    最后掌握好F9 F10 F11

user: user-3
content: 单步调试啊啊

user: user-4
content: 引用 12 楼 qq_18599547 的回复:[quote=引用 10 楼 mewiteor 的回复:] [quote=引用 9 楼 mewiteor 的回复:] [quote=引用 8 楼 mewiteor 的回复:] 第一，字符类型统一用TCHAR。 第二，GetWindowText中的edittext不用取地址。 第三，GetWindowText的第三个参数GetWindowTextLength(subwindow)应该改为edittext的容量255，以防溢出。 还有，MessageBox里的  "提示"  改为  TEXT("提示")[/quote] 还有，MessageBox的最后一个参数类型是UINT，不是指针，用0就可以了，不用NULL。 calloc第二个参数改为sizeof(TCHAR),而不应该为指针。[/quote] 大神 还是空白啊   	TCHAR *edittext; 	HWND subwindow; 	switch(message) 	{ 	case WM_CREATE:		 		CreateButton(TEXT("启  动"),50,50,100,24,hwnd,(HMENU) 1); 		CreateButton(TEXT("取  消"),250,50,100,24,hwnd,(HMENU) 2); 		CreateButton(TEXT("哈哈"),50,100,100,24,hwnd,(HMENU) 3); 		subwindow = CreateEdit(TEXT("我爱C语言\0"),10,10,150,20,hwnd,(HMENU) 4); 		//timer = SetTimer(hwnd,1,1000,TimerProc);//启动计时器 		//GetDlgItemText(subwindow,4,&edittext,255);//获取字符串失败 //-----------------------------以上为创建子窗口------------------------------------- 		setfont(hwnd);//修改子窗口字体         return 0;     case WM_COMMAND: 	 		switch(LOWORD(wParam))//判断子窗口ID 		{ 	    case 1://ID为1 处理消息 			switch(HIWORD(wParam))//判断ID为1 的子窗口消息类型 			{ 			case BN_CLICKED://确定按钮被按下消息 				//setedittext(4,TEXT("哈哈ds")); 				edittext = (TCHAR *) calloc(255,sizeof(TCHAR)); 				GetWindowText(subwindow,edittext,255); 				MessageBox(hwnd,edittext,TEXT("是"),0);				 				free(edittext); [/quote] 问题在于你的subwindow，你的subwindow是个局部变量，只在创建消息时被赋值，消息结束后subwindow被释放，在当前消息的subwindow未被赋值，直接使用，此时的subwindow是个不确定的值。你可以把subwindow设成全局变量或者静态局部变量。 另外，你应该学会调试，在异常处之前设断点，单步调试，看一看变量在哪一步之后就不是预期值，以此来定位bug。

user: user-5
content: 如果lz只是写个带界面的程序的话可以试试mfc或qt

user: user-0
content: 引用 13 楼 zxh707wk 的回复:这不是win32吗...c++属性的... 是呀 写个窗口这么麻烦. 自己创建的控件 居然取不到字符串内容- -

user: user-0
content: 引用 11 楼 paschen 的回复:"提示"改成_T("提示")  wchar_t建议改成TCHAR，因为TCHAR是通用的，在多字节下是char，在UNICODE下是wchar 改了 就什么都显示不出来了

user: user-5
content: 这不是win32吗...c++属性的...

user: user-0
content: 引用 10 楼 mewiteor 的回复:[quote=引用 9 楼 mewiteor 的回复:] [quote=引用 8 楼 mewiteor 的回复:] 第一，字符类型统一用TCHAR。 第二，GetWindowText中的edittext不用取地址。 第三，GetWindowText的第三个参数GetWindowTextLength(subwindow)应该改为edittext的容量255，以防溢出。 还有，MessageBox里的  "提示"  改为  TEXT("提示")[/quote] 还有，MessageBox的最后一个参数类型是UINT，不是指针，用0就可以了，不用NULL。 calloc第二个参数改为sizeof(TCHAR),而不应该为指针。[/quote] 大神 还是空白啊   	TCHAR *edittext; 	HWND subwindow; 	switch(message) 	{ 	case WM_CREATE:		 		CreateButton(TEXT("启  动"),50,50,100,24,hwnd,(HMENU) 1); 		CreateButton(TEXT("取  消"),250,50,100,24,hwnd,(HMENU) 2); 		CreateButton(TEXT("哈哈"),50,100,100,24,hwnd,(HMENU) 3); 		subwindow = CreateEdit(TEXT("我爱C语言\0"),10,10,150,20,hwnd,(HMENU) 4); 		//timer = SetTimer(hwnd,1,1000,TimerProc);//启动计时器 		//GetDlgItemText(subwindow,4,&edittext,255);//获取字符串失败 //-----------------------------以上为创建子窗口------------------------------------- 		setfont(hwnd);//修改子窗口字体         return 0;     case WM_COMMAND: 	 		switch(LOWORD(wParam))//判断子窗口ID 		{ 	    case 1://ID为1 处理消息 			switch(HIWORD(wParam))//判断ID为1 的子窗口消息类型 			{ 			case BN_CLICKED://确定按钮被按下消息 				//setedittext(4,TEXT("哈哈ds")); 				edittext = (TCHAR *) calloc(255,sizeof(TCHAR)); 				GetWindowText(subwindow,edittext,255); 				MessageBox(hwnd,edittext,TEXT("是"),0);				 				free(edittext);

user: user-6
content: "提示"改成_T("提示")  wchar_t建议改成TCHAR，因为TCHAR是通用的，在多字节下是char，在UNICODE下是wchar

user: user-4
content: 引用 9 楼 mewiteor 的回复:[quote=引用 8 楼 mewiteor 的回复:] 第一，字符类型统一用TCHAR。 第二，GetWindowText中的edittext不用取地址。 第三，GetWindowText的第三个参数GetWindowTextLength(subwindow)应该改为edittext的容量255，以防溢出。 还有，MessageBox里的  "提示"  改为  TEXT("提示")[/quote] 还有，MessageBox的最后一个参数类型是UINT，不是指针，用0就可以了，不用NULL。 calloc第二个参数改为sizeof(TCHAR),而不应该为指针。

user: user-4
content: 引用 8 楼 mewiteor 的回复:第一，字符类型统一用TCHAR。 第二，GetWindowText中的edittext不用取地址。 第三，GetWindowText的第三个参数GetWindowTextLength(subwindow)应该改为edittext的容量255，以防溢出。 还有，MessageBox里的  "提示"  改为  TEXT("提示")

user: user-4
content: 第一，字符类型统一用TCHAR。 第二，GetWindowText中的edittext不用取地址。 第三，GetWindowText的第三个参数GetWindowTextLength(subwindow)应该改为edittext的容量255，以防溢出。

user: user-0
content: 引用 6 楼 leee7338 的回复:弱弱的问一下  这是QT么？网上一搜一大堆 不知道啥是QT. 这个是我自己在VC6.0中写的窗口 我想获取edit控件的内容

user: user-0
content: 谢谢大家了. 找出原因了 是句柄无效 错误码 1400 换成主窗口句柄成功获取标题 .

user: user-4
content: 引用 17 楼 mewiteor 的回复:[quote=引用 12 楼 qq_18599547 的回复:] [quote=引用 10 楼 mewiteor 的回复:] [quote=引用 9 楼 mewiteor 的回复:] [quote=引用 8 楼 mewiteor 的回复:] 第一，字符类型统一用TCHAR。 第二，GetWindowText中的edittext不用取地址。 第三，GetWindowText的第三个参数GetWindowTextLength(subwindow)应该改为edittext的容量255，以防溢出。 还有，MessageBox里的  "提示"  改为  TEXT("提示")[/quote] 还有，MessageBox的最后一个参数类型是UINT，不是指针，用0就可以了，不用NULL。 calloc第二个参数改为sizeof(TCHAR),而不应该为指针。[/quote] 大神 还是空白啊   	TCHAR *edittext; 	HWND subwindow; 	switch(message) 	{ 	case WM_CREATE:		 		CreateButton(TEXT("启  动"),50,50,100,24,hwnd,(HMENU) 1); 		CreateButton(TEXT("取  消"),250,50,100,24,hwnd,(HMENU) 2); 		CreateButton(TEXT("哈哈"),50,100,100,24,hwnd,(HMENU) 3); 		subwindow = CreateEdit(TEXT("我爱C语言\0"),10,10,150,20,hwnd,(HMENU) 4); 		//timer = SetTimer(hwnd,1,1000,TimerProc);//启动计时器 		//GetDlgItemText(subwindow,4,&edittext,255);//获取字符串失败 //-----------------------------以上为创建子窗口------------------------------------- 		setfont(hwnd);//修改子窗口字体         return 0;     case WM_COMMAND: 	 		switch(LOWORD(wParam))//判断子窗口ID 		{ 	    case 1://ID为1 处理消息 			switch(HIWORD(wParam))//判断ID为1 的子窗口消息类型 			{ 			case BN_CLICKED://确定按钮被按下消息 				//setedittext(4,TEXT("哈哈ds")); 				edittext = (TCHAR *) calloc(255,sizeof(TCHAR)); 				GetWindowText(subwindow,edittext,255); 				MessageBox(hwnd,edittext,TEXT("是"),0);				 				free(edittext); [/quote] 问题在于你的subwindow，你的subwindow是个局部变量，只在创建消息时被赋值，消息结束后subwindow被释放，在当前消息的subwindow未被赋值，直接使用，此时的subwindow是个不确定的值。你可以把subwindow设成全局变量或者静态局部变量。 另外，你应该学会调试，在异常处之前设断点，单步调试，看一看变量在哪一步之后就不是预期值，以此来定位bug。[/quote]还有，你可以把msdn里GetLastError时的Sample的代码拷过来用，加在windows的API后面，可以显示一些有用的信息。

user: user-7
content: 弱弱的问一下  这是QT么？网上一搜一大堆

user: user-0
content: 引用 4 楼 wang0635 的回复: GetWindowText(subwindow,&edittext,GetWindowTextLength(subwindow)); //不用取地址吧   一直显示空白啊 我就纳闷了

user: user-8
content: GetWindowText(subwindow,&edittext,GetWindowTextLength(subwindow)); //不用取地址吧

user: user-9
content: MessageBox(hwnd,edittext,L"提示",NULL);