2016-10-26 16 views
1

さて、私は実際にC++の人ではなく、おそらく私はコードを読んでいて、私が知っている他の言語に基づいて推測しているので、ちょうどあなたが見ることができるように、プログラムはiniファイルを読んでいる、だから、小さな変更で1つの溶液)ostringstreamでTCHARを使う

... 

BOOL uploadFile(HWND hwnd, LPCTSTR fileName) 
{ 
    const TCHAR* UPLOAD_SERVER = _T("myhostname.com"); //not my real hostname, just for this question 
    const TCHAR* UPLOAD_PATH = _T("/upload.php"); 
    const TCHAR* CONFIG_FILE = _T("config.ini"); 
    const TCHAR* API_KEY = _T("key"); 

    TCHAR szUploadServer[MAX_PATH]; 
    TCHAR szUploadPath[MAX_PATH]; 
    TCHAR szAPI[MAX_PATH]; 
    TCHAR szWD[MAX_PATH]; 

    const char* sBoundary = "----BOUNDARYBOUNDARY----";  // boundary 
    const char sCrLf[] = { 0xd, 0xa, 0x0 };     // ‰üs(CR+LF) 
    const TCHAR* szHeader = 
     _T("Content-type: multipart/form-data; boundary=----BOUNDARYBOUNDARY----"); 

    _tgetcwd(szWD, sizeof(szWD)/sizeof(TCHAR)); 
    _tcsncat(szWD, _T("\\"), 1); 
    _tcsncat(szWD, CONFIG_FILE, _tcslen(CONFIG_FILE)); 

    GetPrivateProfileString(_T("Configuration"), _T("SERVER"), UPLOAD_SERVER, szUploadServer, sizeof(szUploadServer)/sizeof(TCHAR), szWD); 
    GetPrivateProfileString(_T("Configuration"), _T("PATH"), UPLOAD_PATH, szUploadPath, sizeof(szUploadPath)/sizeof(TCHAR), szWD); 
    GetPrivateProfileString(_T("Configuration"), _T("API"), API_KEY, szAPI, sizeof(szAPI)/sizeof(TCHAR), szWD); 
    std::ostringstream buf; 

    // -- "api" part 
    buf << "--"; 
    buf << sBoundary; 
    buf << sCrLf; 
    buf << "content-disposition: form-data; name=\"api\""; 
    buf << sCrLf; 
    buf << sCrLf; 
    buf << szAPI; 
    buf << sCrLf; 
    // -- "imagedata" part 
    buf << "--"; 
    buf << sBoundary; 
    buf << sCrLf; 
    buf << "content-disposition: form-data; name=\"imagedata\""; 
    buf << sCrLf; 
    //buf << "Content-type: image/png"; // ˆê‰ž 
    //buf << sCrLf; 
    buf << sCrLf; 

    // –{•¶: PNG ƒtƒ@ƒCƒ‹‚ð“Ç‚Ýž‚Þ 
    std::ifstream png; 
    png.open(fileName, std::ios::binary); 
    if (png.fail()) { 
     MessageBox(hwnd, _T("PNG open failed"), szTitle, MB_ICONERROR | MB_OK); 
     png.close(); 
     return FALSE; 
    } 
    buf << png.rdbuf();  // read all & append to buffer 
    png.close(); 

    // ÅŒã 
    buf << sCrLf; 
    buf << "--"; 
    buf << sBoundary; 
    buf << "--"; 
    buf << sCrLf; 

    // ƒƒbƒZ[ƒWŠ®¬ 
    std::string oMsg(buf.str()); 

...後で何行...

HttpSendRequest(hRequest, 
       szHeader, 
       lstrlen(szHeader), 
       (LPVOID)oMsg.c_str(), 
       (DWORD) oMsg.length()) 

をコンパイルしたい、書き込みszAPIへのAPIキー、そしてそれをostringstream(buf)で使用する必要があります。 PHPのPOST変数を見ると、iniファイルに32文字の英数字の文字列を与えたい場合、8桁の16進数 "0019EEE0"を返します。私はtcharを文字列に変換する方法を調べましたが、実際には何も私のために働いていませんでした。私は、ヘッダファイルに

#ifndef UNICODE 
    typedef std::string szAPI; 
#else 
    typedef std::wstring szAPI; 
#endif 

を入れると、何も起こりませんし、私が使用する変数は文字列に変換する必要があるとき、私は右のそれを置く、それエラー(シンボルのtypedefで過負荷にすることはできません)

TCHARを使ってヘッダーを作成することはできますが、コードを使ってAPIヘッダーのすぐ下のヘッダーに画像を配置する方法はわかりません。

私はこの仕事をすることで一種の損失になります。私はAPIキーをiniファイルに入れる必要があるので、生成されたiniファイルとexeファイルを使ってPHPでzipを構築してから送信して、誰が自分のサーバーに何をアップロードしているかを追跡できます。

アイデアがありましたら、ありがとうございます。

+0

'TCHAR'の目的は、Windows 9x用のプログラムをビルドして、Windows 9xで限られたローカル文字セットを使用できるようにすることでした。この醜いマクロベースのデバイスは、Unicodeのためのレイヤーの導入によって2000年に廃止されました。それから数年後、Windows 9xはもうなくなった。あなたは、Windows 9xをターゲットにしていますか?Layer for Unicodeを使用しないのがよい理由はありますか?そうでない場合は、地球上でなぜTCHARを使用していますか? –

+0

現代のWindowsでは、ワイド文字( 'wchar_t'に基づく文字列と関数)を使用し、それを使って処理します。 –

+0

Windows APIラッパー以外のものでTCHARを使用しないでください。これは、ANSI文字エンコーディングとワイド文字の間で移行するように設計されています。 C stdlibに関する限り、TCHARは存在しません。ソフトウェアが使用する文字エンコードを決定し、適切な標準ライブラリ関数を使用します。 –

答えて

1

で作業を開始しましたUTF8を期待する。

char api[MAX_PATH]; 
wcstombs(api, szAPI, wcslen(szAPI) + 1); 

この変換は必ずしも機能しません。

通常、UTF16をUTF8に変換するには、WideCharToMultiByteを使用する必要があります。

Visual Studioを使用しているので、便宜上、ATLクラスを使用できます。

#include <AtlStr.h> 

... 
CStringA sA = CW2A(szAPI, CP_UTF8); 

sAにはUTF8データが含まれています。次のように使用します。

my_ostringstream << sA.GetString(); 

または

HttpSendRequest(hRequest, szHeader, lstrlen(szHeader), 
    (LPVOID)sA.GetString(), (DWORD)sA.GetLength()); 
+0

ありがとうございます。 utf16はどんな状況でもうまく動作していたようですが、私はこれに切り替えました。私はPHPファイルのアップロードのために、imagedataにヘッダファイル名を付ける必要がありました。 – Alice

0

さて、これはおそらく、物事を行うための最善の方法ではありませんが、私は時間のためにしようとしてきた、あなたが述べたように、Windowsの使用UTF16が、インターネット機能を持っているとして、それが

... 

GetPrivateProfileString(_T("Configuration"), _T("SERVER"), UPLOAD_SERVER, szUploadServer, sizeof(szUploadServer)/sizeof(TCHAR), szWD); 
GetPrivateProfileString(_T("Configuration"), _T("PATH"), UPLOAD_PATH, szUploadPath, sizeof(szUploadPath)/sizeof(TCHAR), szWD); 
GetPrivateProfileString(_T("Configuration"), _T("API"), API_KEY, szAPI, sizeof(szAPI)/sizeof(TCHAR), szWD); 
char api[MAX_PATH]; 
wcstombs(api, szAPI, wcslen(szAPI) + 1); 

... 
0

をあなたは、Win32を使用してコードを使用するので、クリーンな方法は、文字列操作は、UCS-16スペースで動作させるために代わりstd::ostringstreamstd::wostringstreamを使用することです。

もう1つの回避策は、アプリケーションでANSI関数の問題が発生していない場合に、Win32のANSI関数を使用してマルチバイトのスペース(たとえば、GetPrivateProfileStringA())を処理する方法です。

関連する問題