Otevření souboru, přetažením. – C / C++ – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

Otevření souboru, přetažením. – C / C++ – Fórum – Programujte.comOtevření souboru, přetažením. – C / C++ – Fórum – Programujte.com

 

Toto vlákno bylo označeno za vyřešené — příspěvek s řešením.
BDS+3
Věrný člen
23. 2. 2013   #1
-
0
-

Zdravím Vás, potřeboval bych poradit s funkcí, která by měla otevřít soubor, přetažením myší na okno aplikace.

Jde o projekt CLR WindowsFormApplication ve VS 2008 Express.

Funkce:

protected: virtual void Form1::WndProc(System::Windows::Forms::Message %m) override 
  {
     if(m.Msg==WM_DROPFILES)
   {
    wchar_t lpszFile[MAX_PATH] = {0};
    UINT uFile = 0;
    HDROP hDrop = (HDROP)m.WParam.ToInt32();
   
    uFile = DragQueryFileW(hDrop, 0xFFFFFFFF, NULL, NULL);

     if (DragQueryFileW(hDrop, 0, lpszFile, MAX_PATH))
     {
     OpenMyFile(lpszFile);
     }
  
    DragFinish(hDrop);
   }
   WndProc(m);
  }

Hlásí mi to chyby:

LNK2028: unresolved token (0A000010) "extern "C" void __stdcall DragFinish(struct HD...

  LNK2028: unresolved token (0A000011) "extern "C" unsigned int __stdcall DragQueryFileW(....

LNK2019: unresolved external symbol "extern "C" void __stdcall DragFinish(...

LNK2019: unresolved external symbol "extern "C" unsigned int __stdcall DragQueryFileW(st...

Nahlásit jako SPAM
IP: 85.71.83.–
W11 :)
Radek Chalupa
~ Redaktor
+1
Super člen
24. 2. 2013   #2
-
0
-

#1 BDS
V projektu chybí příslušná .lib knihovna, kterou potřebuje linker pro sestavení - konkrétně (jak lze zjistit v dokumentaci u popisu funkce DragQueryFile) jde o shell32.lib.

Přidat ji můžeš přímo ve zdrojovém kódu (nejlépe do stdafx.h):

#pragma comment (lib, "shell32.lib")

A ještě pozor!!!

DragQueryFile vrací plnou cestu k souboru, je MAX_PATH málo, resp. nemusí vždy stačit. MAX_PATH představuje max. délku pouze jedné složky cesty (tj. jméno souboru bez cesty nebo jméno jedné z položek cesty).

Takže můžeš pomocí volání DragQueryFile s parametrem NULL získat požadovanou délku ve znacích (bez koncové nuly) a naalokovat buffer dynamicky (v bytech (vysledek +1) * sizeof(WCHAR)). Popřípadě použít hodnotu 32768, což je jak jsem někde dohledal teoretická max délka plné cesty v NTFS.

Radek Chalupa
- vývoj software na zakázku
- školení programování (C/C++, WinAPI, ATL, COM, ActiveX, C#, NET Framework, MFC)
http://www.radekchalupa.cz

Nahlásit jako SPAM
IP: 213.220.211.–
BDS+3
Věrný člen
24. 2. 2013   #3
-
0
-

#2 Radek Chalupa

Děkuju za pomoc. Kompilace sice proběhla v pořádku, ale ještě tam mám něco špatně, protože se aplikace nerozběhne.

Windows hlásí "aplikace přestala pracovat.

Přikládám upravený kód pro kontrolu:

protected: virtual void Form1::WndProc(System::Windows::Forms::Message %m) override 
  {
   if(m.Msg==WM_DROPFILES)
   {
    wchar_t *Files;
    UINT uFile = 0;
    HDROP hDrop = (HDROP)m.WParam.ToInt32();
   
    uFile = DragQueryFileW(hDrop, 0xFFFFFFFF, NULL, NULL);
    if(uFile)
	{
	 Files = new wchar_t[(uFile+1)*sizeof(wchar_t)];
	 if(DragQueryFileW(hDrop, 0, Files, uFile))OpenMYFile(Files);
	 delete [] Files;
	}    
  
    DragFinish(hDrop);
   }
   Form1::WndProc(m);
  }
Nahlásit jako SPAM
IP: 85.71.83.–
W11 :)
Radek Chalupa
~ Redaktor
+1
Super člen
24. 2. 2013   #4
-
0
-

#3 BDS
Pokud se aplikace vůbec nespustí pak to s největší pravděpodobností nebude z důvodu téhle funkce.

Může to mít x důvodů, měl bys napsat zda se rozběhne alespoň v dubug uvnitř Visual Studia nebo zda je ten problém na jiném počítači než byla aplikace sestavená....

Radek Chalupa
- vývoj software na zakázku
- školení programování (C/C++, WinAPI, ATL, COM, ActiveX, C#, NET Framework, MFC)
http://www.radekchalupa.cz

Nahlásit jako SPAM
IP: 213.220.211.–
ingiraxo+15
Grafoman
24. 2. 2013   #5
-
0
-

nějak nerozumim, proč se to snažíš vyřešit přes winapi, když děláš v .NET.. použij na to techniky z .NETu

k tomu sloužejí události DragEnter a DragLeave

Nahlásit jako SPAM
IP: 213.168.183.–
Moje aplikace: http://ophite.cz
Tutoriály na: C#
BDS+3
Věrný člen
24. 2. 2013   #6
-
0
-

#4 Radek Chalupa
už jsem sice zjistil proč to padá

nechal jsem tam % (Forms::Message %m) override

Teď mám tu funkci takto:

protected: virtual void WndProc(System::Windows::Forms::Message *m) 
  {
   if(m->Msg ==WM_DROPFILES)
   {
    HDROP hDrop = (HDROP)m->WParam.ToInt32();
	wchar_t *wcsFile;
    UINT uFile = 0;
	if(DragQueryFile(hDrop, 0xFFFFFFFF, NULL, 0))
	{
     uFile = DragQueryFileW(hDrop, 0, NULL, NULL);
     wcsFile = new wchar_t[(uFile+1)*sizeof(wchar_t)];
	 if(DragQueryFile(hDrop, 0, wcsFile, uFile))OpenMYFile(wcsFile);
     delete []wcsFile;
	}    
    
    DragFinish(hDrop);
	//this->Text = L"WM_DROPFILES";
   }
   Form1::WndProc(m);
  }

ale pořád je to špatně. Aplikace se sice spouští správně, ale zachycení zpráv nefunguje.

Pokud teď připojím override hlásí mi to varování:

 warning C4490: 'override' : incorrect use of override specifier

recursive on all control paths, function will cause runtime stack overflow

Nahlásit jako SPAM
IP: 85.71.83.–
W11 :)
BDS+3
Věrný člen
24. 2. 2013   #7
-
0
-

#5 ingiraxo
protože jsem v BDS 2006 vždy používal tohle, tak jsem naivně čekal, že to bez problémů rozchodím i ve VS

Nahlásit jako SPAM
IP: 85.71.83.–
W11 :)
Radek Chalupa
~ Redaktor
+1
Super člen
24. 2. 2013   #8
-
0
-

#6 BDS
Na konci musíš volat WndProc předka, tj Form::WndProc, tak jak to máš voláš "sám sebe" v nekonečném cyklu...

Radek Chalupa
- vývoj software na zakázku
- školení programování (C/C++, WinAPI, ATL, COM, ActiveX, C#, NET Framework, MFC)
http://www.radekchalupa.cz

Nahlásit jako SPAM
IP: 213.220.211.–
BDS+3
Věrný člen
24. 2. 2013   #9
-
0
-

#8 Radek Chalupa
Děkuju moc, tohle jsem přehlídl.

takže tady je konečné funkční řešení: 

protected: virtual void WndProc( Message %m ) override
  {
   if(m.Msg ==WM_DROPFILES)
   {
    HDROP hDrop = (HDROP)m.WParam.ToInt32();
    wchar_t *wcsFile;
    UINT uFile = 0;
	if(DragQueryFile(hDrop, (UINT)-1, NULL, 0))
	{
         uFile = DragQueryFileW(hDrop, 0, NULL, NULL);
         wcsFile = new wchar_t[(uFile+1)*sizeof(wchar_t)];
	 if(DragQueryFile(hDrop, 0, wcsFile, uFile+1))OpenMYFile(wcsFile);
         delete []wcsFile;
	}    
    
    DragFinish(hDrop);
	
   }
   Form::WndProc(m);
  }
Nahlásit jako SPAM
IP: 85.71.83.–
W11 :)
Řešení
BDS+3
Věrný člen
24. 2. 2013   #10
-
0
-
Vyřešeno Nejlepší odpověď

 ještě s menším využitím paměti:

protected: virtual void WndProc( Message %m ) override
  {
   if(m.Msg ==WM_DROPFILES)
   {
    HDROP hDrop = (HDROP)m.WParam.ToInt32();
    wchar_t *wcsFile;
    UINT uFile = 0;
    if(DragQueryFile(hDrop, (UINT)-1, NULL, 0))//zjištění počtu souborů
    {
     uFile = DragQueryFileW(hDrop, 0, NULL, NULL);//zjištění délky pro index 0
     wcsFile = new wchar_t[uFile+1];
     if(DragQueryFile(hDrop, 0, wcsFile, uFile+1))OpenMYFile(wcsFile);//načtení souboru index 0
     delete []wcsFile;
    }    
    
    DragFinish(hDrop);	
   }
   Form::WndProc(m);
  }
Nahlásit jako SPAM
IP: 85.71.83.–
W11 :)
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 75 hostů

Podobná vlákna

Otevření souboru — založil Sajmi

Otevření souboru — založil Jakub Vojáček

Otevření souboru — založil dc195

Otevření souboru — založil Pavel

Otevření souboru — založil Honza

Moderátoři diskuze

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý