purebasic.info

PureBasic forum
Текущее время: Ср ноя 20, 2019 12:41 am

Часовой пояс: UTC + 3 часа




Начать новую тему Ответить на тему  [ Сообщений: 16 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: AssocQueryStringW не получается
СообщениеДобавлено: Вт янв 22, 2019 2:38 am 
Не в сети
профессор

Зарегистрирован: Чт фев 09, 2017 10:37 am
Сообщений: 503
Благодарил (а): 34 раз.
Поблагодарили: 58 раз.
Пункты репутации: 0
Как получить путь к проге по расширению файла?
Попытка не удачная
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Procedure.s FileAssociation(Ext$)
        Protected Res, OutRes.s = Space(65536)
        Res = AssocQueryString_($40, 2, @Ext$, #Null, @OutRes, 65536)
        If Not Res
                ProcedureReturn "1" + OutRes
        ElseIf Res = $80070002
                ProcedureReturn "2" + OutRes
        ElseIf Res = $80004005
                ProcedureReturn "3" + OutRes
        Else
                ProcedureReturn "4" + OutRes
        EndIf
EndProcedure
 
Debug FileAssociation(".txt")



Вот как выглядит рабочий вариант на AutoIt3
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
Func _FileAssociation($sExt)
        Local $aCall = DllCall("shlwapi.dll", "int", "AssocQueryStringW", _
                        "dword", 0x00000040, _ ;$ASSOCF_VERIFY
                        "dword", 2, _ ;$ASSOCSTR_EXECUTABLE
                        "wstr", $sExt, _
                        "ptr", 0, _
                        "wstr", "", _
                        "dword*", 65536)
        If @error Then Return SetError(1, 0, "")
        If Not $aCall[0] Then
                Return SetError(0, 0, $aCall[5])
        ElseIf $aCall[0] = 0x80070002 Then
                Return SetError(1, 0, "{unknown}")
        ElseIf $aCall[0] = 0x80004005 Then
                Return SetError(1, 0, "{fail}")
        Else
                Return SetError(2, $aCall[0], "")
        EndIf
EndFunc



Есть пример например тут, не рабочий


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: AssocQueryStringW не получается
СообщениеДобавлено: Вт янв 22, 2019 3:27 am 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 914
Благодарил (а): 2 раз.
Поблагодарили: 45 раз.
Пункты репутации: 9
Несколько вариантов.
один создать прототип с функцией AssocQueryStringW
после открыть либу shlwapi.dll и получить адрес AssocQueryStringW
Потому как функций этой длл нет в пурике по крайней мери у меня. :roll:
PS:Как то так
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 
Prototype.i AssocQueryStringW(flags.i, ASSOCSTR.s, *pszAssoc,pszExtra.s,*pszOut,*pcchOut );мог с типом напутать pszExtra.s и можно без прототипа использовать функцию
Procedure.s FileAssociation(Ext$)
  OpenLibrary(0,shlwapi.dll);открыть библиотеку в локале
  Protected AssocQueryStringW.AssocQueryStringW=GetFunction(0,"AssocQueryStringW");получить адрес функции W для utf A asci
  Protected Res, OutRes.s = Space(65536)
        Res = AssocQueryStringW($40, 2, @Ext$, #NULL$, @OutRes, 65536)
        CloseLibrary(0)
      If Not Res
                ProcedureReturn "1" + OutRes
        ElseIf Res = $80070002
                ProcedureReturn "2" + OutRes
        ElseIf Res = $80004005
                ProcedureReturn "3" + OutRes
        Else
                ProcedureReturn "4" + OutRes
        EndIf
EndProcedure
 
 



Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: AssocQueryStringW не получается
СообщениеДобавлено: Вт янв 22, 2019 7:51 am 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6559
Благодарил (а): 31 раз.
Поблагодарили: 221 раз.
Пункты репутации: 59
AZJIO писал(а):
Как получить путь к проге по расширению файла?

Если файл реально существует, то можно проще
Код:
1
2
3
4
5
6
File$ = OpenFileRequester("file", "", "*.*", 0)
If File$
    Ass$=Space(256)
    FindExecutable_(GetFilePart(file$),GetPathPart(file$),@Ass$)
    MessageRequester("",Ass$)
EndIf



P.S.
Если не существует, то можно создать временную пустышку с нужным расширением.

На PB5.6* нормально работает такой код
Код:
1
2
3
4
5
6
7
8
#ASSOCSTR_COMMAND  = $1
#ASSOCF_ISPROTOCOL = $1000
pcchOut = #MAX_PATH
pszOut$ = Space(pcchOut)
 
If AssocQueryString_(#ASSOCF_ISPROTOCOL, #ASSOCSTR_COMMAND, @".doc", @"open", @pszOut$, @pcchOut) = #S_OK
    MessageRequester("",pszOut$)
EndIf


_________________
read-only ¯\_(ツ)_/¯


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: AssocQueryStringW не получается
СообщениеДобавлено: Вт янв 22, 2019 1:24 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11541
Благодарил (а): 4 раз.
Поблагодарили: 475 раз.
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
Procedure.s FileAssociation(Ext$)
  Protected Res, OutRes.s = Space(65536)
  Protected Size=StringByteLength(OutRes)
  Res = AssocQueryString_($40, 2, @Ext$, #Null, @OutRes, @Size)
  If Not Res
    ProcedureReturn "1 " + OutRes
  ElseIf Res = $80070002
    ProcedureReturn "2 " + OutRes
  ElseIf Res = $80004005
    ProcedureReturn "3 " + OutRes
  Else
    ProcedureReturn "4 " + OutRes
  EndIf
EndProcedure
 
Debug FileAssociation(".txt")


_________________
Компьютер позволяет решать все те проблемы, которые до его изобретения не существовали. :) :)


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: AssocQueryStringW не получается
СообщениеДобавлено: Вт янв 22, 2019 5:48 pm 
Не в сети
профессор

Зарегистрирован: Пн июл 22, 2013 11:00 pm
Сообщений: 914
Благодарил (а): 2 раз.
Поблагодарили: 45 раз.
Пункты репутации: 9
Разобрался почему у меня функция не работала,потому что не было подсказки когда пишешь код и подумал функции нет в пурике и давай либу открывать.... :roll:
А так да работает
Код:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
 
Procedure.s FileAssociation(Ext$)
  Protected Res,OutRes.s
  Protected Size
  AssocQueryString_($40,2, @Ext$, #Null, #Null, @Size)
  OutRes = Space(Size)
  Res = AssocQueryString_($40,2, @Ext$, #Null, @OutRes, @Size)
 
  If Res=0
    ProcedureReturn "1 " + OutRes
  ElseIf Res = $80070002
    ProcedureReturn "2 " + OutRes
  ElseIf Res = $80004005
    ProcedureReturn "3 " + OutRes
  Else
    ProcedureReturn "4 " + OutRes
  EndIf
EndProcedure
 
Debug FileAssociation(".txt")
 
Prototype.i AssocQueryStringW(flags.i, *ASSOCSTR, *pszAssoc,pszExtra.i,*pszOut,*pcchOut ); и можно без прототипа использовать функцию
Procedure.s FileAssociation2(Ext$)
  OpenLibrary(0,"C:\Windows\System32\shlwapi.dll");открыть библиотеку в локале
  Protected AssocQueryStringW.AssocQueryStringW=GetFunction(0,"AssocQueryStringW");получить адрес функции W для utf A asci
  Protected Res,OutRes.s
  Protected Size
  AssocQueryStringW($40,2, @Ext$, #Null, #Null, @Size)
  OutRes = Space(Size)
  Res = AssocQueryStringW($40,2, @Ext$, #Null, @OutRes, @Size)
 
        CloseLibrary(0)
      If Not Res
                ProcedureReturn "1" + OutRes
        ElseIf Res = $80070002
                ProcedureReturn "2" + OutRes
        ElseIf Res = $80004005
                ProcedureReturn "3" + OutRes
        Else
                ProcedureReturn "4" + OutRes
        EndIf
EndProcedure
 
Debug FileAssociation2(".txt")
 



Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: AssocQueryStringW не получается
СообщениеДобавлено: Ср янв 23, 2019 1:00 am 
Не в сети
профессор

Зарегистрирован: Чт фев 09, 2017 10:37 am
Сообщений: 503
Благодарил (а): 34 раз.
Поблагодарили: 58 раз.
Пункты репутации: 0
kvitaliy писал(а):
FindExecutable_
я как раз просматривал раздел WinAPI и копировал код в файлы, сразу мысль, почему бы не сделать в начале тему с архивом всех примеров в виде файлов, чтобы каждый не копировал по кусочкам, а было скопировано 1 раз. Те же названия файлов типа "Очистить корзину EmptyRecycleBin" с добавлением используемой функции, чтобы можно было искать файл по имени функции и при неудаче по содержимому. Корневая папка WinAPI, а в ней папка "файлы" с примерами и т.д.
А ещё была мысль сделать прогу для сдирания примеров со страницы, вот только как их обзывать, если прочитать содержимое то обозвать конечно легче. Или сделать плагин, который встроит в код страницы кнопки "Скопировать код", ну хоть что-то упростить. Или написать прогу, чтобы при выделении текста копировала его и если в нём содержится пару из ключевых слов языка, то предложить сохранение в файл с добавлением закомментированной ссылки в первой строке файла. Вот даже примеры в код-архиве и на форуме не одно и тоже.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: AssocQueryStringW не получается
СообщениеДобавлено: Ср янв 23, 2019 8:29 am 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6559
Благодарил (а): 31 раз.
Поблагодарили: 221 раз.
Пункты репутации: 59
AZJIO писал(а):
я как раз просматривал раздел WinAPI и копировал код в файлы, сразу мысль, почему бы не сделать в начале тему с архивом всех примеров в виде файлов, чтобы каждый не копировал по кусочкам, а было скопировано 1 раз.

Я уже давал ссылку на хороший сборник по API
Если есть желание и время русифицируйте этот архив, тут вся библиотека и программа управления:
Скачать
Тогда и можно будет выкладывать весь архив по Win API.

_________________
read-only ¯\_(ツ)_/¯


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: AssocQueryStringW не получается
СообщениеДобавлено: Чт янв 24, 2019 7:14 am 
Не в сети
профессор

Зарегистрирован: Вт май 13, 2014 4:12 am
Сообщений: 896
Благодарил (а): 95 раз.
Поблагодарили: 26 раз.
Пункты репутации: 5
только в этой проге многие имена папок/файлов по немецки, из-за этого не все примеры доступны в проге, нужно лезть в папку с кодами
например папка MenБ
пришлось свой просмотрщик написать, где то выкладывал


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: AssocQueryStringW не получается
СообщениеДобавлено: Пт янв 25, 2019 8:40 am 
Не в сети
профессор

Зарегистрирован: Чт фев 09, 2017 10:37 am
Сообщений: 503
Благодарил (а): 34 раз.
Поблагодарили: 58 раз.
Пункты репутации: 0
newJS писал(а):
только в этой проге многие имена папок/файлов по немецки, из-за этого не все примеры доступны в проге, нужно лезть в папку с кодами
например папка MenБ
пришлось свой просмотрщик написать, где то выкладывал

папки слева, IDE PureBasic справа - вот и весь просмотрщик. Но там я ещё видел ссылки, их можно в исходники добавить. А то что-то переименование дублирует элементы в дереве причём странно, частично.


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: AssocQueryStringW не получается
СообщениеДобавлено: Пт янв 25, 2019 10:13 pm 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6559
Благодарил (а): 31 раз.
Поблагодарили: 221 раз.
Пункты репутации: 59
newJS писал(а):
только в этой проге многие имена папок/файлов по немецки

Русифицировать эту поделку оказалось делом нескольких минут (конечно ПРОМТом).
Изображение
Но вот проблему с доступностью некоторого кода из программы остается. Из за того, что прога не Юникодная это не просто сделать, тем более, что там всё так запутано в плане ссылок, куча файлов ссылаются друг на друга.

_________________
read-only ¯\_(ツ)_/¯


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: AssocQueryStringW не получается
СообщениеДобавлено: Сб янв 26, 2019 7:15 am 
Не в сети
профессор

Зарегистрирован: Чт фев 09, 2017 10:37 am
Сообщений: 503
Благодарил (а): 34 раз.
Поблагодарили: 58 раз.
Пункты репутации: 0
kvitaliy писал(а):
Но вот проблему с доступностью некоторого кода из программы остается. Из за того, что прога не Юникодная это не просто сделать, тем более, что там всё так запутано в плане ссылок, куча файлов ссылаются друг на друга.

То есть проще пользоваться папка+IDE?
Я сейчас используя автоматизацию перевода скрипт+QTranslate перевёл значения ключей, правда как и раньше гугл заблокировал мне временно доступ после 500 обращений, но глюки остались те же. Я попробовал с помощью своей проги переименования файлов сгенерировать список восстановления имён используя содержимое ini и переименовал германские названия файлов в русские, но опять же стало ещё хуже, русские файлы вообще не видит.
В общем итог: сделать переименование файлов в русские и на этом почти закончить. Ну кроме того что сделать также авто-перевод текстов в кавычках с выводом лога, потому что подозреваю что в качестве текста может оказаться ком-строка. А также попробовать вместо гугла использовать сервис майкрософт, там вроде лучше переводят компьютерный язык, слово "путь" переведут как "Path", а не "Way".


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: AssocQueryStringW не получается
СообщениеДобавлено: Сб янв 26, 2019 9:38 am 
Не в сети
профессор

Зарегистрирован: Вт май 13, 2014 4:12 am
Сообщений: 896
Благодарил (а): 95 раз.
Поблагодарили: 26 раз.
Пункты репутации: 5
в моей проге нет проблем с 1251, она видит все файлы из папки codes и все выводит в редактор, а после редактирования и при переименованиии сохраняет в utf8? ну и поиск в ней есть

и что каждому мешает свою оболочку написать, как самому удобно
а в той проге бесполезно что то делать, не задумана она под нормальные языки типа русского поэтому и написал свою оболочку

AZJIO писал(а):
А то что-то переименование дублирует элементы в дереве причём странно, частично.

не понимаю о чём речь? как это? тогда это копирование получается


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: AssocQueryStringW не получается
СообщениеДобавлено: Сб янв 26, 2019 10:03 am 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6559
Благодарил (а): 31 раз.
Поблагодарили: 221 раз.
Пункты репутации: 59
newJS писал(а):
а в той проге бесполезно что то делать, не задумана она под нормальные языки типа русского поэтому и написал свою оболочку

Нормально может работать с русским. Дополнительно исправил некоторые ошибки открытия файлов.
А где твоя оболочка, дай ещё раз, размещу как альтернативу в соотв. разделе.

_________________
read-only ¯\_(ツ)_/¯


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: AssocQueryStringW не получается
СообщениеДобавлено: Сб янв 26, 2019 10:48 am 
Не в сети
профессор

Зарегистрирован: Чт фев 09, 2017 10:37 am
Сообщений: 503
Благодарил (а): 34 раз.
Поблагодарили: 58 раз.
Пункты репутации: 0
Вот архив переименованы pb и ini, но либо то либо то, потому что для ini требуются не переименованные pb. Переводил в макрософт, ничего не редактируя. Перевёл немецкий и английский варианты.

архив папки Codes с переименованием файлов в русские имена с использованием текстов kvitaliy


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: AssocQueryStringW не получается
СообщениеДобавлено: Сб янв 26, 2019 12:02 pm 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6559
Благодарил (а): 31 раз.
Поблагодарили: 221 раз.
Пункты репутации: 59
AZJIO писал(а):
Вот архив переименованы pb и ini, но либо то либо то, потому что для ini требуются не переименованные pb. Переводил в макрософт, ничего не редактируя. Перевёл немецкий и английский варианты.

архив папки Codes с переименованием файлов в русские имена с использованием текстов kvitaliy

Дополнил альтернативным переводом в теме с программой.
Думаю, что перевод имен .pb удобно использовать отдельно. Или самому написать управляющую программу.

_________________
read-only ¯\_(ツ)_/¯


Вернуться наверх
 Профиль  
 
Показать сообщения за:  Сортировать по:  
Начать новую тему Ответить на тему  [ Сообщений: 16 ]  На страницу 1, 2  След.

Часовой пояс: UTC + 3 часа


Кто сейчас на форуме

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 6


Вы не можете начинать темы
Вы не можете отвечать на сообщения
Вы не можете редактировать свои сообщения
Вы не можете удалять свои сообщения
Вы не можете добавлять вложения

Найти:
Перейти:  
cron
Создано на основе phpBB® Forum Software © phpBB Group (блог о phpBB)
Сборка создана CMSart Studio
Русская поддержка phpBB