Сейчас на форуме: UniSoft, laslo, bartolomeo (+5 невидимых) |
eXeL@B —› Программирование —› Вопрос про Shell.Application Namespace |
Посл.ответ | Сообщение |
|
Создано: 27 августа 2011 12:34 · Поправил: Rainbow · Личное сообщение · #1 Доброе время суток. На днях появилась необходимость использовать данный метод, но вопрос так и не смог решить сам, суть состоит в следущем: в описании метода по MSDN данный метод имеет 1 аргумент, цитата из MSDN: Creates and returns a Folder object for the specified folder. Syntax retVal = Shell.NameSpace( vDir ) Parameters vDir [in] Type: Variant The folder for which to create the Folder object. This can be a string that specifies the path of the folder or one of the ShellSpecialFolderConstants values. Note that the constant names found in ShellSpecialFolderConstants are available in Visual Basic, but not in VBScript or JScript. In those cases, the numeric values must be used in their place. Return Value Type: Folder Object reference to the Folder object for the specified folder. If the folder is not successfully created, this value returns null. Ладно, это понять можно, при вызове данного метода из MASM32-программы там получается 2 аргумента по их словам, т.е. 1й аргумент - описатель интерфейса Shell, и затем аргумент vDir [in]. Все бы ничего но когда я залез в декларацию методов заголовочных файлов C++ (EXDISP.H), я увидел следущее: /* [helpstring] */ HRESULT ( STDMETHODCALLTYPE __RPC_FAR *NameSpace )( IShellDispatch __RPC_FAR * This, /* [in] */ VARIANT vDir, /* [retval][out] */ Folder __RPC_FAR *__RPC_FAR *ppsdf); Из этого можно понять, что 3им аргументом передается переменная которая будет возвращать описатель объекта Folder, о чем было сказано в msdn но не было указано в качестве аргумента. Ладно, и это тоже можно понять, но когда прикомпиляции вызываю данный метод, захожу под олькой по F7 в него и вижу то что метод заканчивается на RET18, то есть по сути метод должен принимать 6!!! аргументов - это повергло меня в ступор. Вопрос сегодня следущий: как нужно реализовывать вызов данного метода через MASM32 ??? P.S. Интрефейс объявлял следущим образом (интерфейс объявлен не полностью, но для вызова NameSpace достаточно): comethod1Proto typedef proto :DWORD comethod2Proto typedef proto :DWORD, :DWORD comethod3Proto typedef proto :DWORD, :DWORD, :DWORD comethod4Proto typedef proto :DWORD, :DWORD, :DWORD, :DWORD comethod5Proto typedef proto :DWORD, :DWORD, :DWORD, :DWORD, :DWORD comethod6Proto typedef proto :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD comethod7Proto typedef proto :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD comethod8Proto typedef proto :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD comethod9Proto typedef proto :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD comethod10Proto typedef proto :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD comethod11Proto typedef proto :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD comethod12Proto typedef proto :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD comethod13Proto typedef proto :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD comethod14Proto typedef proto :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD comethod15Proto typedef proto :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD comethod16Proto typedef proto :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD comethod17Proto typedef proto :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD comethod18Proto typedef proto :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD comethod19Proto typedef proto :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD comethod20Proto typedef proto :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD, :DWORD comethod1 typedef ptr comethod1Proto comethod2 typedef ptr comethod2Proto comethod3 typedef ptr comethod3Proto comethod4 typedef ptr comethod4Proto comethod5 typedef ptr comethod5Proto comethod6 typedef ptr comethod6Proto comethod7 typedef ptr comethod7Proto comethod8 typedef ptr comethod8Proto comethod9 typedef ptr comethod9Proto comethod10 typedef ptr comethod10Proto comethod11 typedef ptr comethod11Proto comethod12 typedef ptr comethod12Proto comethod13 typedef ptr comethod13Proto comethod14 typedef ptr comethod14Proto comethod15 typedef ptr comethod15Proto comethod16 typedef ptr comethod15Proto comethod17 typedef ptr comethod15Proto comethod18 typedef ptr comethod15Proto comethod19 typedef ptr comethod15Proto comethod20 typedef ptr comethod15Proto IUnknownInterface struct QueryInterface comethod3 ? AddRef comethod1 ? Release comethod1 ? IUnknownInterface ends IDispatchInterface struct GetTypeInfoCount comethod2 ? GetTypeInfo comethod4 ? GetIDsOfNames comethod6 ? IDispatchInvoke comethod9 ? IDispatchInterface ends IShellDispatch struct IUnknownInterface <> IDispatchInterface <> GetApplication comethod2 ? GetParent comethod2 ? NameSpace comethod2 ? BrowseForFolder comethod6 ? Windows comethod2 ? Open comethod2 ? Explore comethod2 ? MinimizeAll comethod1 ? UndoMinimizeALL comethod1 ? FileRun comethod1 ? IShellDispatch ends |
|
Создано: 27 августа 2011 18:52 · Личное сообщение · #2 |
|
Создано: 27 августа 2011 18:55 · Личное сообщение · #3 |
|
Создано: 27 августа 2011 20:35 · Личное сообщение · #4 |
|
Создано: 29 августа 2011 01:01 · Личное сообщение · #5 |
|
Создано: 29 августа 2011 11:12 · Личное сообщение · #6 |
|
Создано: 29 августа 2011 15:52 · Личное сообщение · #7 С этим все более-менее понятно, спасибо за сорцы и exe. В сорцах переменная типа VARIANT, передаваемая в NAMESPACE-метод имеет тип VT_I4 и значение ssfPROGRAMFILES (26h) все бы ничего, но необходимо применить данный метод к своеему пути, не обозначенному системной константой. Вопрос: Какой тип нужно указать VT_BSTR и передать указатель на строку, или же как-то через массив??? P.S. Уже перебрал все матерные слова.. |
|
Создано: 29 августа 2011 20:12 · Личное сообщение · #8 да, VT_BSTR и указатель на строку Code:
| Сообщение посчитали полезным: Rainbow |
|
Создано: 29 августа 2011 21:35 · Личное сообщение · #9 Интересно следущее: применяя метод к директории C:, namespace возвращает указатель на IFolder, но если применить данный метод к zip-файлу по сути являющейся сжатой папкой, которая должна тоже распознаваться как папка, NAMESPACE возвращает 1 и все тут. Изначальная цель была создание архива средствами windows. По идее я все сделал правильно, но че-то нихрена не работает делал по VBS-скрипту, который РАБОТАЕТ. Выкладываю ниже скрипт. Set objApp = CreateObject( "Shell.Application" ) objApp.NameSpace( myZipFile ).CopyHere objApp.NameSpace( myFolder ).Items Эти 2 строки наглядно дают понять что даже применительно для zip-файла должен возвращаться IFolder интерфейс, что бы вызвать метод CopyHere, но интерфейс почему-то конкретно для zip не возвращается P.S. Перед всеми этими телодвижениями я предварительно создаю .zip файл с такими данными EmptyZipFileSignature db "PK", 05h, 06h, 12h dup (0) В чем косяк ? 6977_29.08.2011_EXELAB.rU.tgz - 1.rar |
|
Создано: 30 августа 2011 10:26 · Личное сообщение · #10 косяк в том, что в корень диска просто так вам никто не даст записать, а 1 это есть S_FALSE, т.е. не прошла регистрация namespace'a для объекта cd6c_30.08.2011_EXELAB.rU.tgz - ishell.rar | Сообщение посчитали полезным: Rainbow |
|
Создано: 30 августа 2011 19:17 · Личное сообщение · #11 Очень странно, но все получилось, у меня просто происходит неведомая еб**ая х**ня на компе. Компилишь батником, отлаживается хер пойми как.. Откуда-то иногда привилегированные инструкции попадаются на месте обычных push-ей или вместо push адрес в стек попадает еще какое-то число.. Переименовываешь ехе-файл и все работает нормально. P.S. Пользуясь случаем и обстановкой предельной ясности конечной цели попытаюсь задать еще один вопрос: пароли на zip-архивы созданные таким образом устанавливаются через что? o.O Потому что как бы в скрипте про пароли сказано было, но возможно кусок кода который отвечал за это был порипан... Но я уверен что такое возможно т.к. стандартными средствами в explorere они устанавливаются и отвечает за эти все дела библиотека zipfldr.dll которая управляется только через IShellDispatch. Интересно какой объект использовать? |
|
Создано: 31 августа 2011 00:17 · Личное сообщение · #12 Еще прикол такой, мб это только у меня так, вызывается метод CopyHere, возвращает STATUS_SUCCESS, как положено, LastError тоже все впорядке, только файлов в архиве так и не увидел, пробовал как с методом с директорией, только на ASM, так и с отдельными файлами в других разделах, нежели где стоит система - бесполезно. У тебя все нормально копирует ? |
|
Создано: 31 августа 2011 11:11 · Поправил: Av0id · Личное сообщение · #13 по поводу неведомой силы, то удаляй udd по-чаще или вообще не анализируй, вообщем ольгу настрой помоему копирование происходит во время вызова release + нужно какое-то время на упаковку, у тебя в vbs по 200 миллисекунд на файл по поводу zipfldr.dll его com не документирована по поводу паролей, дай vbs, а там видно будет ps. в чем собственно говоря обоснованность использования этого метода для архивации? да еще и com на асме, эстетика? куда подальше такую эстетику, юзайте C# с SevenZipLib - для работы с com проще не придумали |
|
Создано: 10 сентября 2011 13:06 · Поправил: Rainbow · Личное сообщение · #14 |
eXeL@B —› Программирование —› Вопрос про Shell.Application Namespace |