Zmienna w URLDownloadToFile

0

Witam, mam mały problem ze zmienną.
Gdy wstawiam zmienną do funkcji:

String^ zmienna = gcnew String("C:\\test.png");
URLDownloadToFile( NULL, L"http://l-rp.pl/images/logo.png", zmienna, 0, NULL );

Wyskakuje mi błąd:

 error C2664: 'URLDownloadToFileW' : cannot convert parameter 3 from 'System::String ^' to 'LPCWSTR'

I tu rodzi się moje pytanie:
Jak skonwertować zmienną na LPCWSTR ?

Proszę o pomoc :)

0
#include <vcclr.h>
...
String^ zmienna = L"C:\\test.png";
pin_ptr<const wchar_t> zmienna_ptr = PtrToStringChars(zmienna);

zmienna_ptr możesz teraz traktować jak const wchar_t*, a tym jest właśnie LPCWSTR.

Na czas życia tego wskaźnika, właściwy string (zmienna) jest „przypięty”, czyli wyjęty spod garbage collectora.

0

A czy sprawdzałeś zmianę
String^ zmienna = gcnew String("C:\test.png");

na
String^ zmienna = gcnew String(L"C:\test.png");

Skoro działa dla drugiego argumentu, to powinna i dla trzeciego.

BTW: skoro nie używasz funkcji zwrotnej w wywołaniu URLDownloadToFile(), to może lepiej nie mieszać kodu .NET i WinAPI i użyć System.Net.WebClient.DownloadFile() lub System.Net.WebClient.DownloadFileAsync()?

0

Skoro działa dla drugiego argumentu, to powinna i dla trzeciego.
Dla drugiego działa, bo jest tam literał znakowy – który sam z siebie jest typu const wchar_t* (z L) lub const char* (bez L).
Nie ma znaczenia co podasz do konstruktora String(), przecież powstaje obiekt tej samej klasy.

String^ zmienna = gcnew String("C:\\test.png");

to działa, bo istnieje konstruktor String::String(char* value)

String^ zmienna = gcnew String(L"C:\\test.png");

to działa, bo istnieje konstruktor String::String(wchar_t* value)

Problem pojawia się w drugą stronę: przy próbie przekazania parametru typu String^ do funkcji, która przyjmuje const wchar_t*. Takiej konwersji nie ma.

0

Dzięki chłopaki ;)

1 użytkowników online, w tym zalogowanych: 0, gości: 1