2013-12-19 3 views
1
#include "stdafx.h" 
#include <windows.h> 
#include <tlhelp32.h> 
#include <tchar.h> 
#include <iostream> 
#include <UrlMon.h> 
#include <cstring> 
#pragma comment(lib, "UrlMon.lib") 
using namespace std; 

int main() 
{ 
char* appdata = getenv("APPDATA"); //Gets %Appdata% path 
char* truepath = strcat(appdata, "\\USR\\file.dat"); // file location 

cout << truepath ; 
HRESULT hr = URLDownloadToFile(NULL, _T("http://localhost:8080/upload.php?name=Huh?" + truepath), _T("d"), 0, NULL); 
cin.get(); 
return 0; 
} 

Это мой код выше, и я получаю сообщение об ошибке на этой полосе:не в состоянии использовать символ * с URLDownloadToFile

HRESULT hr = URLDownloadToFile(NULL, _T("http://localhost:8080/upload.php?name=Huh?" + truepath), _T("d"), 0, NULL); 

Ошибка компиляции это дает мне говорит, что «+ truepath» является там невозможно использовать.

Я пробовал .c_str() и несколько других способов, но не могу заставить его работать. Любая помощь приветствуется.

+4

Вы не можете объединить char * с строковым литералом с помощью оператора +. Используйте std :: string/std :: wstring – user1233963

+1

Кроме того, этот 'strcat' уничтожает блок памяти переменных окружения. –

+0

Строят ли для Ansi или UNICODE? – manuell

ответ

4
// ANSI Build 
std::string appdata(getenv("APPDATA")); 
appdata += "\\USR\\file.dat"; 
std::string url("http://localhost:8080/upload.php?name=Huh?"); 
url += appdata; 
URLDownloadToFile(NULL, url.c_str(), [...] 

// UNICODE Build 
std::wstring appdata(_wgetenv(L"APPDATA")); 
appdata += L"\\USR\\file.dat"; 
std::wstring url(L"http://localhost:8080/upload.php?name=Huh?"); 
url += appdata; 
URLDownloadToFile(NULL, url.c_str(), [...] 
+0

Спасибо, например, не возражаете, если вы добавите пример Unicode? – user2699298

+0

'ошибка C2664: 'URLDownloadToFileW': не может преобразовать параметр 2 из 'const char *' в 'LPCWSTR'' и' 1> Указанные типы не связаны; Для преобразования требуется reinterpret_cast, литье в стиле C или функция-стиль cast' – user2699298

+1

странный. c_str() return const wchar_t * для std :: wstring. Проверьте свой код. – manuell

4

Вы не можете добавить два указателя.

truepath является указателем на символ.

И когда вы говорите "http://localhost:8080/upload.php?name=Huh?", он возвращает указатель на char. Таким образом, вы пытаетесь добавить два указателя, и вот что стандарт говорит об операторе аддитивных ...

5.7 
For addition, either both operands shall have arithmetic or unscoped enumeration 
type, or one operand shall be a pointer to a completely-defined object 
type and the other shall have integral or unscoped enumeration type. 

Кроме того, вы должны выделить память для переменной truepath или иначе это приведет к краху.

+0

+1 (извините, я думаю, что я украл галочку) – manuell

+0

@manuell :-) Это хорошо, брат ... Счастливое кодирование ... –

Смежные вопросы