さて、私は実際に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を構築してから送信して、誰が自分のサーバーに何をアップロードしているかを追跡できます。
アイデアがありましたら、ありがとうございます。
'TCHAR'の目的は、Windows 9x用のプログラムをビルドして、Windows 9xで限られたローカル文字セットを使用できるようにすることでした。この醜いマクロベースのデバイスは、Unicodeのためのレイヤーの導入によって2000年に廃止されました。それから数年後、Windows 9xはもうなくなった。あなたは、Windows 9xをターゲットにしていますか?Layer for Unicodeを使用しないのがよい理由はありますか?そうでない場合は、地球上でなぜTCHARを使用していますか? –
現代のWindowsでは、ワイド文字( 'wchar_t'に基づく文字列と関数)を使用し、それを使って処理します。 –
Windows APIラッパー以外のものでTCHARを使用しないでください。これは、ANSI文字エンコーディングとワイド文字の間で移行するように設計されています。 C stdlibに関する限り、TCHARは存在しません。ソフトウェアが使用する文字エンコードを決定し、適切な標準ライブラリ関数を使用します。 –