Použití PickIconDlg z shell32.dll   zodpovězená otázka

VB.NET

Dobrý den,

ve své aplikaci chci využít PickIconDlg pro výběr ikon a narazil jsem na následující problém. Pokud je cesta k souboru, s ikonou, delší jak 48 znaků, dialog cestu ořízne, takže je to prakticky nepoužitelné.

zde je můj kód:

Public Class DialogPickIcon

    Declare Unicode Function PickIconDlg Lib "Shell32" Alias "PickIconDlg" (ByVal hwndOwner As IntPtr, ByVal lpstrFile As String, ByVal nMaxFile As Integer, ByRef lpdwIconIndex As Integer) As Integer

    Private iconFile_ As String
    Private iconIndex_ As Integer

    Public Property IconFile() As String
        Get
            Return iconFile_
        End Get
        Set(ByVal value As String)
            iconFile_ = value
        End Set
    End Property

    Public Property IconIndex() As Integer
        Get
            Return iconIndex_
        End Get
        Set(ByVal value As Integer)
            iconIndex_ = value
        End Set
    End Property

    Public Sub New(ByVal path As String, ByVal index As Integer)
        iconFile_ = path
        iconIndex_ = index
    End Sub

    Public Function Show(ByVal owner As IntPtr) As System.Windows.Forms.DialogResult
        Dim retval As Integer = PickIconDlg(owner, iconFile_, iconFile_.Length * 2, iconIndex_)
        Select Case retval
            Case 0
                retval = System.Windows.Forms.DialogResult.Cancel
            Case 1
                retval = System.Windows.Forms.DialogResult.OK
        End Select

        Return retval
    End Function
End Class

Našel jsem ukázku použití v c++, kde je vidět změna kódování textu, před a po vyvolání dialogu. Bohužel nevím, jak toto převést do VB.

http://www.codeproject.com/KB/dialog/Pic...

	char  mStr[MAX_PATH] = {0};
	WCHAR wstrFile[MAX_PATH];
	MultiByteToWideChar(CP_ACP,0,mStr,MAX_PATH,wstrFile,MAX_PATH);
	int re = PickIconDlg(this->m_hWnd,wstrFile,MAX_PATH,&mIndex);
	WideCharToMultiByte(CP_ACP,0,wstrFile,MAX_PATH,mStr,MAX_PATH,0,0);

Bude někdo schopen mi poradit?

Předem díky za všechny odpovědi.

HD

nahlásit spamnahlásit spam 0 odpovědětodpovědět

http://msdn.microsoft.com/en-us/library/...

nahlásit spamnahlásit spam -1 / 1 odpovědětodpovědět

A toto má být jako co?! Nechápu proč odpovídáte takové hovadiny, když vůbec nevíte která bije. S maximální délkou cesty k souboru v různých souborových systémech to vůbec nesouvisí.

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Já tam vidím problém v předávání délky textového řetězce (třetí parametr funkce PickIconDlg). Proč předáváte velikost řetězce x2 a ne skutečnou velikost řetězce? Jakože to je Unicode tak dvoubajtové x2? V tom bude ten problém. V dokumentaci k funkci PickIconDlg se jasně píše, že pokud délka řetězce nebude souhlasit, může být cesta oříznuta, což je přesně váš případ.

http://msdn.microsoft.com/en-us/library/...

(This buffer should be at least MAX_PATH characters in length, or the returned path may be truncated.)

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

Velikost řetězce x2, byl jeden z trochu zoufalých pokusů, jak to vyřešit. Bohužel nefunguje ani varianta, kterou navrhujete vy. Ve chvíli, kdy je vrácená cesta delší než původní, tak dojde k oříznutí.

nahlásit spamnahlásit spam 0 odpovědětodpovědět

Tak nakonec jsem to vyřešil takto

    Const MAX_PATH As Integer = 260

    Public Function Show(ByVal owner As IntPtr) As System.Windows.Forms.DialogResult
        iconFile_ &= vbNullChar & Space(MAX_PATH)
        Dim retval As Integer = PickIconDlg(owner, iconFile_, iconFile_.Length, iconIndex_)
        Select Case retval
            Case 0
                retval = System.Windows.Forms.DialogResult.Cancel
            Case 1
                retval = System.Windows.Forms.DialogResult.OK
        End Select

        Return retval
    End Function

Díky za nakopnutí

nahlásit spamnahlásit spam 1 / 1 odpovědětodpovědět

To je přesně ono, předem alokovat řetězec byl skvělý nápad.

nahlásit spamnahlásit spam 0 odpovědětodpovědět
                       
Nadpis:
Antispam: Komu se občas házejí perly?
Příspěvek bude publikován pod identitou   anonym.
  • Administrátoři si vyhrazují právo komentáře upravovat či mazat bez udání důvodu.
    Mazány budou zejména komentáře obsahující vulgarity nebo porušující pravidla publikování.
  • Pokud nejste zaregistrováni, Vaše IP adresa bude zveřejněna. Pokud s tímto nesouhlasíte, příspěvek neodesílejte.

přihlásit pomocí externího účtu

přihlásit pomocí jména a hesla

Uživatel:
Heslo:

zapomenuté heslo

 

založit nový uživatelský účet

zaregistrujte se

 
zavřít

Nahlásit spam

Opravdu chcete tento příspěvek nahlásit pro porušování pravidel fóra?

Nahlásit Zrušit

Chyba

zavřít

feedback