表单提交过程: lpszFieldName == 表单名 lpszFieldValue == 表单值(可能要接收中文)
HRESULT
CParseNetPage::CUploader::UploadField( HINTERNET hRequest, string strBoundary,
LPCTSTR lpszFieldName, LPCTSTR lpszFieldValue )
{
string fieldHeader = GenerateFieldHeader(strBoundary, lpszFieldName); DWORD dwBytesWritten;
if (!InternetWriteFile( hRequest, (LPCVOID)fieldHeader.data(),
(DWORD)fieldHeader.size(), &dwBytesWritten) )
{
char buff[100];
wsprintf( buff, "InternetWriteFile Header failed, error = %d (0x%x)\n", GetLastError(), GetLastError());
MessageBox( NULL, (LPCTSTR)fieldHeader.data(), "FieldHeader", MB_OK );
return HRESULT_FROM_WIN32(GetLastError());
}
string fieldValue = lpszFieldValue; // fieldValue 这个字段会接收中文
if (!InternetWriteFile( hRequest, (LPCVOID)(LPCTSTR)fieldValue.data(),
(DWORD)fieldValue.size(), &dwBytesWritten) )
{
char buff[100];
wsprintf( buff,"InternetWriteFile value failed, error = %d (0x%x)\n", GetLastError(), GetLastError());
MessageBox( NULL, (LPCTSTR)fieldValue.data(), "FieldValue", MB_OK );
return HRESULT_FROM_WIN32(GetLastError());
} string fieldTrailer = GenerateFieldTrailer();
if (!InternetWriteFile( hRequest, (LPCVOID)fieldTrailer.data(),
(DWORD)fieldTrailer.size(), &dwBytesWritten ) )
{
char buff[100];
wsprintf( buff,"InternetWriteFile trailer failed, error = %d (0x%x)\n", GetLastError(), GetLastError());
MessageBox( NULL, buff, "FieldTrailer", MB_OK );
return HRESULT_FROM_WIN32(GetLastError());
} return S_OK;
}
HRESULT
CParseNetPage::CUploader::UploadField( HINTERNET hRequest, string strBoundary,
LPCTSTR lpszFieldName, LPCTSTR lpszFieldValue )
{
string fieldHeader = GenerateFieldHeader(strBoundary, lpszFieldName); DWORD dwBytesWritten;
if (!InternetWriteFile( hRequest, (LPCVOID)fieldHeader.data(),
(DWORD)fieldHeader.size(), &dwBytesWritten) )
{
char buff[100];
wsprintf( buff, "InternetWriteFile Header failed, error = %d (0x%x)\n", GetLastError(), GetLastError());
MessageBox( NULL, (LPCTSTR)fieldHeader.data(), "FieldHeader", MB_OK );
return HRESULT_FROM_WIN32(GetLastError());
}
string fieldValue = lpszFieldValue; // fieldValue 这个字段会接收中文
if (!InternetWriteFile( hRequest, (LPCVOID)(LPCTSTR)fieldValue.data(),
(DWORD)fieldValue.size(), &dwBytesWritten) )
{
char buff[100];
wsprintf( buff,"InternetWriteFile value failed, error = %d (0x%x)\n", GetLastError(), GetLastError());
MessageBox( NULL, (LPCTSTR)fieldValue.data(), "FieldValue", MB_OK );
return HRESULT_FROM_WIN32(GetLastError());
} string fieldTrailer = GenerateFieldTrailer();
if (!InternetWriteFile( hRequest, (LPCVOID)fieldTrailer.data(),
(DWORD)fieldTrailer.size(), &dwBytesWritten ) )
{
char buff[100];
wsprintf( buff,"InternetWriteFile trailer failed, error = %d (0x%x)\n", GetLastError(), GetLastError());
MessageBox( NULL, buff, "FieldTrailer", MB_OK );
return HRESULT_FROM_WIN32(GetLastError());
} return S_OK;
}
我用apache+libcgi写cgi的没有遇到这种情况
CParseNetPage::CUploader::UploadField( HINTERNET hRequest, string strBoundary,
LPCTSTR lpszFieldName, LPCTSTR lpszFieldValue )
{
.....
if( fieldValue.compare( "11.doc" ) != 0 ) {
MessageBox( NULL, (LPCTSTR)(LPWSTR)fieldValue.data(), "ling", MB_OK );
if (!InternetWriteFile( hRequest, (LPCVOID)(LPWSTR)fieldValue.data(),
(DWORD)fieldValue.size(), &dwBytesWritten) )
{
char buff[100];
wsprintf( buff,"InternetWriteFile value failed, error = %d (0x%x)\n", GetLastError(), GetLastError());
MessageBox( NULL, (LPCTSTR)fieldValue.data(), "FieldValue", MB_OK );
return HRESULT_FROM_WIN32(GetLastError());
}
} else {
MessageBox( NULL, (LPCTSTR)(LPWSTR)fieldValue.data(), "1111111", MB_OK );
wchar_t *w = (wchar_t*)"1中国人工智能1.doc";
if (!InternetWriteFile( hRequest, (wchar_t*)w/*fieldValue.data()*/,
(DWORD)fieldValue.size(), &dwBytesWritten) )
{
char buff[100];
wsprintf( buff,"InternetWriteFile value failed, error = %d (0x%x)\n", GetLastError(), GetLastError());
MessageBox( NULL, (LPCTSTR)fieldValue.data(), "FieldValue", MB_OK );
return HRESULT_FROM_WIN32(GetLastError());
}
MessageBox( NULL, (LPCTSTR)(wchar_t*)w, "asdfsssssssss", MB_OK );
}
.................
return S_OK;
}
void MultiByteToUTF8( LPCTSTR pszSrc, int cchSrc, LPSTR lpDestStr,
int cchDest, UINT nCodePage = 950 )
{
WCHAR * pws = new WCHAR[cchSrc];
memset(pws, 0, (cchSrc)*sizeof(WCHAR));
memset(lpDestStr, 0, cchDest);
int nLen = MultiByteToWideChar(CP_ACP, 0, pszSrc, -1, NULL, NULL);
int cchWChar = MultiByteToWideChar( nCodePage, 0, pszSrc,cchSrc, pws, nLen );
LdapUnicodeToUTF8( pws, cchWChar, lpDestStr, cchDest );
wsprintf( buff, "cchwchar= %d lstrlen: %d", cchWChar, lstrlen( lpDestStr ) );
// "当pszSrc = "工人.doc"时 cchWChar == lstrlen( lpDestStr ) - 2
MessageBox( NULL, buff, "22222222", MB_OK );
delete[] pws;
}
使用:
char DestStr[100];
memset( DestStr, 0, sizeof( DestStr ) );
int size = (int)fieldValue.size();
MultiByteToUTF8( (LPCTSTR)fieldValue.data(), size, DestStr, size, 936 ); 当我将 fieldValue = "工人.doc 放入表面提交后, 在页面上显示为 "工人.d"根据汉字的多少, 会少一些字节..... 怎么做才能让它我转入的数据正确的在页面上显示呢.
定义了_UNICODE,TCHAR定义为WCHAR,
定义了_MBCS,TCHAR定义为char
字符串处理函数用<tchar.h>中定义的各种对应函数,如_tcscpy取代strcpy...
2、也可以用常用的转换函数:
char--wchar
MultiByteToWideChar(CP_ACP,0,srcstr,-1,destwstr,buflen)
wchar--char
WideCharToMultiByte(CP_ACP,0,srcwstr,-1,deststr,buflen,NULL,NULL)