关于TCHAR输出的问题~

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了关于TCHAR输出的问题~相关的知识,希望对你有一定的参考价值。

我在A函数里算出来一个数double类型的,比如是X。然后我定义了的B函数的形参有个是X,B函数体内有个语句是把X显示到对话框上的,具体是这样的:
TCHAR szScale[100000]=0;
sprintf(szScale,"%.1f Kbps",X);
pDC->TextOut(width-115,25,szScale);
为什么数据稍微大一点就完全不对了~~~在几十几百的时候都正确,但上了千后就完全不对了~~再大点都和理想值差一个数量级了~但我在控制台输出X是正确的
这是怎么回事??
我是在A中调用B的
不好意思啊~两位大大~~昨天我又重新调试了下,确实不是TCHAR的问题~~
问题出在LISTCTRL的控件上,我在A函数里用recv收到的数存在buf缓冲区中,然后从里面取出数据进行分析,把分析结果显示到LIST的控件上,问题就出在SetItemText上,把这句注释掉就没问题了,我也不知道为什么???我计算的时候用的是recv 的返回值在一定时间内累加得到的数,计算完后清零,返回值没有问题,但只要有了SetItemText,那个累加得到的数就有问题了~整整差了一个数量级~另外,计算过程是在SetItemText前面的~~实在是想不通是什么原因~~麻烦各位高手指点12~~~多谢多谢~~

你用UNICODE字符集了吗?
用了的话TCHAR代表wchar_t,否则代表char
如果用了UNICODE字符集:
TCHAR sz[100];
可以不初始化。
也可以用ZeroMemory初始化
swprintf_s( sz,100,L"%lfkbps",x);
//然后一样。
如果不是UNICODE:
TCHAR sz[100];
sprintf_s(s,100,"%lfkbps",x);
你的x是double型,用%lf.
参考技术A 是不是你每次清零的时候字符串没有注意还原成空啊?
你把每一步都Debug一下,看看哪些值异常啊

//应该跟TCHAR没关系,不然你把它换成char看看。
//可能有2个问题,1个是你显示的区域不够,部分未显示出来,另外就是如果你数字超过double型范围的话也可能不对。
//还有你把空间申请小一点。。。10w几乎0.2M的空间,再加一个0差不多你程序就挂了。
TCHAR szScale[1000]=0; //空间申请小些
sprintf(szScale,"%.1f Kbps",X);
pDC->TextOut(width-115,25,szScale); //注意显示区域,你可以用0,0看看是不是完全显示了。
参考技术B he

Wininet上传文件TCHAR问题

【中文标题】Wininet上传文件TCHAR问题【英文标题】:Wininet upload file TCHAR problems 【发布时间】:2014-03-14 08:48:46 【问题描述】:

Dev C++ Wininet Upload file using HTTP 这里是 wininet 的例子。 我已经改了,但我不能让它工作!首先有警告说 char 函数与 TCHAR 变量一起使用。我已经用正确的函数替换了这些函数。

#include <windows.h>
#include <wininet.h>
#include <tchar.h>
#include <iostream>

#include "stdafx.h"
#include <windows.h>
#include <wininet.h>
#include <tchar.h>
#include <iostream>

#pragma comment(lib,"wininet.lib")

using namespace std;

int _tmain(int argc, _TCHAR* argv[])

    static TCHAR frmdata[] = L"-----------------------------7d82751e2bc0858\r\nContent-Disposition: form-data; name=\"file\"; filename=\"C:\\test.txt\"\r\nContent-Type: text/plain\r\n\r\nAAAAAAAAAAAAAAAAA\r\n-----------------------------7d82751e2bc0858--\r\n";
    static TCHAR hdrs[] = L"Content-Type: multipart/form-data; boundary=---------------------------7d82751e2bc0858"; 

    HINTERNET hSession = InternetOpen(L"MyAgent",INTERNET_OPEN_TYPE_PRECONFIG, NULL, NULL, 0);
     if(hSession==NULL)
    
     cout<<"Error: InternetOpen";  
    


    HINTERNET hConnect = InternetConnect(hSession, L"localhost",INTERNET_DEFAULT_HTTP_PORT, NULL, NULL, INTERNET_SERVICE_HTTP, 0, 1);
     if(hConnect==NULL)
    
     cout<<"Error: InternetConnect";  
    

    HINTERNET hRequest = HttpOpenRequest(hConnect, L"POST",L"/upload/upload.php", NULL, NULL, (LPCWSTR *)"*/*\0", 0, 1);
    if(hRequest==NULL)
    
     cout<<"Error: HttpOpenRequest";  
    

    BOOL sent= HttpSendRequest(hRequest, hdrs, wcslen(hdrs), frmdata, wcslen(frmdata));
    if(!sent)
    
     cout<<"Error: HttpSendRequest";
     

    //close any valid internet-handles
    InternetCloseHandle(hSession);
    InternetCloseHandle(hConnect);
    InternetCloseHandle(hRequest);

[/代码]

但它仍然无法正常工作!这就是我用netcat得到的

connect to [127.0.0.1] from validation.sls.microsoft.com [127.0.0.1] 52503
POST /upload/upload.php HTTP/1.1
Content-Type: multipart/form-data; boundary=---------------------------7d82751e
bc0858
User-Agent: MyAgent
Host: 127.0.0.1
Content-Length: 210
Cache-Control: no-cache
Cookie: s_pers=%20s_fid%3D6D463DCA024AF939-1C2604BDB2B68135%7C1457266833122%3B%
0s_vs%3D1%7C1394110233124%3B%20s_nr%3D1394108433125-Repeat%7C1425644433125%3B

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - 7 d 8 2 7 5 1 e 2 b c
  8 5 8
 C o n t e n t - D i s p o s i t i o n :   f o r m - d a t a ;   n a m e = " f
 l e " ;   f i l e n a m e = " C : \ t

我只是不明白为什么会这样。我已经改变了这个字符串

sent= HttpSendRequest(hRequest, hdrs, wcslen(hdrs), frmdata, wcslen(frmdata)*sizeof(TCHAR) );

并再次使用 ncat 捕获数据包。它看起来像这样:

connect to [127.0.0.1] from validation.sls.microsoft.com [127.0.0.1] 52570
POST /upload/upload.php HTTP/1.1
Content-Type: multipart/form-data; boundary=---------------------------7d82751e2
bc0858
User-Agent: MyAgent
Host: 127.0.0.1
Content-Length: 420
Cache-Control: no-cache
Cookie: s_pers=%20s_fid%3D6D463DCA024AF939-1C2604BDB2B68135%7C1457266833122%3B%2
0s_vs%3D1%7C1394110233124%3B%20s_nr%3D1394108433125-Repeat%7C1425644433125%3B

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - 7 d 8 2 7 5 1 e 2 b c
  8 5 8
 C o n t e n t - D i s p o s i t i o n :   f o r m - d a t a ;   n a m e = " f i
 l e " ;   f i l e n a m e = " C : \ t e s t . t x t "
 C o n t e n t - T y p e :   t e x t / p l a i n

 A A A A A A A A A A A A A A A A A
 - - - - - - - - - - - - - - - - - - - - - - - - - - - - - 7 d 8 2 7 5 1 e 2 b c
 0 8 5 8 - -

但还是有问题,因为我无法在 upload.php 脚本中上传数据(它是 100% 工作脚本,我用随机文件检查过它)。另外 netcat 中的数据看起来很奇怪,为什么字符之间有空格?也许是因为 TCHAR 数据?所以我还是很困惑。如何让它发挥作用?我认为这个问题出在 TCHAR 类型上,但必须有办法让它适用于任何类型。请帮忙。也对不起我的英语,它不是我的母语。所有帮助将不胜感激!

【问题讨论】:

TCHAR 无论如何都已经过时了,除非出于某种原因您的目标是 Windows 2000 之前的版本,否则它是不必要的。启用 Unicode 并使用 WCHAR。 我试过了,什么都没有。另外,TCHAR 不是在 unicode 激活时使用 wchar_t 的宏吗? 【参考方案1】:

对于HttpSendRequest 调用,LPVOID lpOptional 不应为 unicode。

试试这个:

char pszData[] = "-----------------------------7d82751e2bc0858\r\nContent-Disposition: form-data; name=\"file\"; filename=\"C:\\test.txt\"\r\nContent-Type: text/plain\r\n\r\nAAAAAAAAAAAAAAAAA\r\n-----------------------------7d82751e2bc0858--\r\n";
BOOL sent= HttpSendRequest(hRequest, hdrs, wcslen(hdrs), pszData, strlen(pszData));

【讨论】:

以上是关于关于TCHAR输出的问题~的主要内容,如果未能解决你的问题,请参考以下文章

将 SHORT 转换为 TCHAR?

Cwcharchar格式化符输出

int _tmain(int argc, _TCHAR* argv[])

字符数组的输入与输出

C++第一章:输出Hello World

DirectShow控制台输出和保存视频设备名称