Сейчас на форуме: UniSoft, laslo, bartolomeo (+5 невидимых)

 eXeL@B —› Программирование —› Вопрос про Shell.Application Namespace
Посл.ответ Сообщение


Ранг: 110.8 (ветеран), 104thx
Активность: 0.090.01
Статус: Участник

Создано: 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



Ранг: 516.1 (!), 39thx
Активность: 0.280
Статус: Участник

Создано: 27 августа 2011 18:52
· Личное сообщение · #2

думаю вам нужно сначала на си это написать, разберетесь со структурами и потом можно будет сделать переход на асм через cl /Fa




Ранг: 110.8 (ветеран), 104thx
Активность: 0.090.01
Статус: Участник

Создано: 27 августа 2011 18:55
· Личное сообщение · #3

Если есть кто пишет на C++ сделайте плз простейшую программку использующую данный метод и выложите хотя бы exe

P.S. с си я не знаком



Ранг: 516.1 (!), 39thx
Активность: 0.280
Статус: Участник

Создано: 27 августа 2011 20:35
· Личное сообщение · #4

вот

ba1d_27.08.2011_EXELAB.rU.tgz - ishell.rar




Ранг: 110.8 (ветеран), 104thx
Активность: 0.090.01
Статус: Участник

Создано: 29 августа 2011 01:01
· Личное сообщение · #5

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



Ранг: 516.1 (!), 39thx
Активность: 0.280
Статус: Участник

Создано: 29 августа 2011 11:12
· Личное сообщение · #6

пустое сообщение

7aaf_29.08.2011_EXELAB.rU.tgz - debug.rar




Ранг: 110.8 (ветеран), 104thx
Активность: 0.090.01
Статус: Участник

Создано: 29 августа 2011 15:52
· Личное сообщение · #7

С этим все более-менее понятно, спасибо за сорцы и exe. В сорцах переменная типа VARIANT, передаваемая в NAMESPACE-метод имеет тип VT_I4 и значение ssfPROGRAMFILES (26h) все бы ничего, но необходимо применить данный метод к своеему пути, не обозначенному системной константой. Вопрос: Какой тип нужно указать VT_BSTR и передать указатель на строку, или же как-то через массив???

P.S. Уже перебрал все матерные слова..



Ранг: 516.1 (!), 39thx
Активность: 0.280
Статус: Участник

Создано: 29 августа 2011 20:12
· Личное сообщение · #8

да, VT_BSTR и указатель на строку
Code:
  1. BSTR _ansi_to_bstr(char *ansistr)
  2. {
  3. int lenA = lstrlenA(ansistr);
  4. int lenW;
  5. BSTR unicodestr = 0;
  6.  
  7. lenW = MultiByteToWideChar(CP_ACP, 0, ansistr, lenA, 0, 0);
  8. if (lenW > 0)
  9. {
  10.   unicodestr = SysAllocStringLen(0, lenW);
  11.   MultiByteToWideChar(CP_ACP, 0, ansistr, lenA, unicodestr, lenW);
  12. }
  13. else
  14. {
  15.   SysFreeString(unicodestr);
  16.   return unicodestr;
  17. }
  18. }
  19. ...
  20.  
  21. VARIANT var;
  22. BSTR str;
  23.  
  24. str = _ansi_to_bstr("c:\temp");
  25. var.vt = VT_BSTR;
  26. var.bstrVal = str;
  27. SysFreeString(str);


| Сообщение посчитали полезным: Rainbow


Ранг: 110.8 (ветеран), 104thx
Активность: 0.090.01
Статус: Участник

Создано: 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



Ранг: 516.1 (!), 39thx
Активность: 0.280
Статус: Участник

Создано: 30 августа 2011 10:26
· Личное сообщение · #10

косяк в том, что в корень диска просто так вам никто не даст записать, а 1 это есть S_FALSE, т.е. не прошла регистрация namespace'a для объекта

cd6c_30.08.2011_EXELAB.rU.tgz - ishell.rar

| Сообщение посчитали полезным: Rainbow


Ранг: 110.8 (ветеран), 104thx
Активность: 0.090.01
Статус: Участник

Создано: 30 августа 2011 19:17
· Личное сообщение · #11

Очень странно, но все получилось, у меня просто происходит неведомая еб**ая х**ня на компе. Компилишь батником, отлаживается хер пойми как.. Откуда-то иногда привилегированные инструкции попадаются на месте обычных push-ей или вместо push адрес в стек попадает еще какое-то число.. Переименовываешь ехе-файл и все работает нормально.

P.S. Пользуясь случаем и обстановкой предельной ясности конечной цели попытаюсь задать еще один вопрос: пароли на zip-архивы созданные таким образом устанавливаются через что? o.O Потому что как бы в скрипте про пароли сказано было, но возможно кусок кода который отвечал за это был порипан... Но я уверен что такое возможно т.к. стандартными средствами в explorere они устанавливаются и отвечает за эти все дела библиотека zipfldr.dll которая управляется только через IShellDispatch. Интересно какой объект использовать?




Ранг: 110.8 (ветеран), 104thx
Активность: 0.090.01
Статус: Участник

Создано: 31 августа 2011 00:17
· Личное сообщение · #12

Еще прикол такой, мб это только у меня так, вызывается метод CopyHere, возвращает STATUS_SUCCESS, как положено, LastError тоже все впорядке, только файлов в архиве так и не увидел, пробовал как с методом с директорией, только на ASM, так и с отдельными файлами в других разделах, нежели где стоит система - бесполезно. У тебя все нормально копирует ?



Ранг: 516.1 (!), 39thx
Активность: 0.280
Статус: Участник

Создано: 31 августа 2011 11:11 · Поправил: Av0id
· Личное сообщение · #13

по поводу неведомой силы, то удаляй udd по-чаще или вообще не анализируй, вообщем ольгу настрой

помоему копирование происходит во время вызова release + нужно какое-то время на упаковку, у тебя в vbs по 200 миллисекунд на файл

по поводу zipfldr.dll его com не документирована

по поводу паролей, дай vbs, а там видно будет

ps. в чем собственно говоря обоснованность использования этого метода для архивации? да еще и com на асме, эстетика? куда подальше такую эстетику, юзайте C# с SevenZipLib - для работы с com проще не придумали




Ранг: 110.8 (ветеран), 104thx
Активность: 0.090.01
Статус: Участник

Создано: 10 сентября 2011 13:06 · Поправил: Rainbow
· Личное сообщение · #14

Интересно, а окно с ProgressBar'ом возможно ли отключить? На флаги FOF_ не реагирует никаким образом.
И неужели нет другого способа дождаться выполнения созданного треда копирования, нежели через Sleep...

ps. Я уже тихо ничинаю ненавидеть MS... Весь мозг съели.


 eXeL@B —› Программирование —› Вопрос про Shell.Application Namespace
:: Ваш ответ
Жирный  Курсив  Подчеркнутый  Перечеркнутый  {mpf5}  Код  Вставить ссылку 
:s1: :s2: :s3: :s4: :s5: :s6: :s7: :s8: :s9: :s10: :s11: :s12: :s13: :s14: :s15: :s16:


Максимальный размер аттача: 500KB.
Ваш логин: german1505 » Выход » ЛС
   Для печати Для печати