Форум программистов, компьютерный форум, киберфорум
Assembler: Windows/protected mode
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.60/5: Рейтинг темы: голосов - 5, средняя оценка - 4.60
0 / 0 / 1
Регистрация: 06.02.2020
Сообщений: 20

Получить указатель на интерфейс IShellFolderView

24.02.2020, 10:31. Показов 988. Ответов 14
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Ребята, помогите получить указатель на интерфейс IShellFolderView, чтобы вызвать метод AutoArrange.
0
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
24.02.2020, 10:31
Ответы с готовыми решениями:

Как получить ссылку на указатель или указатель на указатель в массиве?
В процессе реализации сортировки пузырьком натолкнулся на такую проблему: как поменять значения указателей, передаваемых в функцию. Если...

Как средствами RTTI получить указатель на ComponentArray[0] или как получить значения некоторых свойств?
type TTestComponentItem = class(TComponent) end; TComponentArray = array of TTestComponentItem; TTestComponent =...

Получить указатель на property?
У объектов могут быть динамические свойства. В частности, динамическим свойством может быть QPixmap. Пусть такое свойство в дизайнере...

14
4190 / 1838 / 221
Регистрация: 06.10.2010
Сообщений: 4,124
01.03.2020, 10:03
Вот что пишут на docs.microsoft.com
IShellFolderView is no longer available for use as of Windows 7. Instead, use IFolderView2 and IFolderView.
1
0 / 0 / 1
Регистрация: 06.02.2020
Сообщений: 20
01.03.2020, 11:38  [ТС]
murderer,
Пользуюсь Windows XP.
0
4190 / 1838 / 221
Регистрация: 06.10.2010
Сообщений: 4,124
01.03.2020, 11:52
Ну а в чём проблема? Через SHCreateShellFolderView получаешь указатель на IShellView, затем через его метод QueryInterface запрашиваешь указатель на IShellFolderView.
2
0 / 0 / 1
Регистрация: 06.02.2020
Сообщений: 20
18.03.2020, 10:07  [ТС]
через его метод QueryInterface запрашиваешь указатель на IShellFolderView
В реестре Windows XP SP3 не нахожу идентификатор 37A378C0-F82D-11CE-AE65-08002B2E1262 интерфейса IShellFolderView.
0
4190 / 1838 / 221
Регистрация: 06.10.2010
Сообщений: 4,124
18.03.2020, 12:10
Там и не должно быть. Ты ведь запрашиваешь этот интерфейс у объекта IShellView. В реестре хранятся GUID`ы для объектов, создаваемых через CoCreateInstance.

IShellFolderView is supported by the IShellView object that is returned from SHCreateShellFolderViewEx. This object contains a ListView control and some of the methods on IShellFolderView directly manipulate this ListView control.
0
0 / 0 / 1
Регистрация: 06.02.2020
Сообщений: 20
18.03.2020, 18:05  [ТС]
Assembler
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
.data?
        array dd ?
.const
        iid db 37h,0A3h,78h,0C0h,0F8h,2Dh,11h,0CEh,0AEh,65h,8h,0h,2Bh,2Eh,12h,62h
.code
start:  push eax
            push esp
        call _imp__SHGetDesktopFolder@4
        pop eax
        mov edi,offset array
        push 16
        pop[edi]
        mov[edi+4],eax
        push eax
            push esp
            push edi
        call _imp__SHCreateShellFolderView@8
        pop eax
        mov eax,[eax]
            push edi
            push offset iid
            push 0
        call near ptr[eax]
        ret
end start
Метод QueryInterface возвращает ошибку E_NOINTERFACE.
0
4190 / 1838 / 221
Регистрация: 06.10.2010
Сообщений: 4,124
19.03.2020, 09:49
GUID не правильно определил.

Выдержка из википедии
'22345200-abe8-4f60-90c8-0d43c5f6c0f6' соответствует шестнадцатеричному 128-битному числу 0xF6C0F6C5430DC8904F60ABE822345200
Попробуй так:
Assembler
1
2
3
4
5
iid dd 037A378C0h
    dw 0F82Dh 
    dw 011CEh
    dw 0AE65h
    dq 08002B2E1262h
0
0 / 0 / 1
Регистрация: 06.02.2020
Сообщений: 20
19.03.2020, 11:53  [ТС]
Попробуй так:
Та же самая ошибка.
0
4190 / 1838 / 221
Регистрация: 06.10.2010
Сообщений: 4,124
19.03.2020, 16:39
Да не правильно подсказал - последние 8 байт должны идти в том же порядке как и в текстовом представлении.

Вот на FASM - вроде бы работает
Assembler
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
46
47
48
49
50
51
52
53
54
format PE GUI
include 'win32wx.inc'
 
struc GUID def
 {
   match d1-d2-d3-d4-d5, def
    \{
      .Data1 dd 0x\#d1
      .Data2 dw 0x\#d2
      .Data3 dw 0x\#d3
      .Data4 db 0x\#d4 shr 8,0x\#d4 and 0FFh
      .Data5 db 0x\#d5 shr 40,0x\#d5 shr 32 and 0FFh,0x\#d5 shr 24 and 0FFh,0x\#d5 shr 16 and 0FFh,0x\#d5 shr 8 and 0FFh,0x\#d5 and 0FFh
    \}
 }
 
struct SFV_CREATE
  cbSize   rd 1
  pshf     rd 1
  psvOuter rd 1
  psfvcb   rd 1
ends
 
interface IShellView,\
          QueryInterface,\
          AddRef,\
          Release
 
section '' code readable writeable executable
  entry $
  invoke  CoInitialize,0
  invoke  SHGetDesktopFolder,csfv.pshf
  invoke  SHCreateShellFolderView,csfv,psv
  cominvk psv,QueryInterface,iid,psfv
  invoke  ExitProcess,0
 
  csfv SFV_CREATE sizeof.SFV_CREATE
  iid  GUID 37A378C0-F82D-11CE-AE65-08002B2E1262
  psv  IShellView
  psfv rd 1
 
section '' import readable
  library kernel32,'kernel32.dll',\
          shell32,'Shell32.dll ',\
          ole32,'ole32.dll'
 
  import  kernel32,\
          ExitProcess,'ExitProcess'
 
  import  shell32,\
          SHGetDesktopFolder,'SHGetDesktopFolder',\
          SHCreateShellFolderView,'SHCreateShellFolderView'
 
  import  ole32,\
          CoInitialize,'CoInitialize'
Добавлено через 1 минуту
CoInitialize обязательно
1
Asm/C++/Delphi/Py/PHP/VBA
 Аватар для Jin X
6811 / 2051 / 238
Регистрация: 14.12.2014
Сообщений: 4,301
Записей в блоге: 12
19.03.2020, 18:19
GUID нужно записывать группами word/dword, кроме последних двух (там идёт побайтная разбивка):
Assembler
1
2
3
4
; {22345200-abe8-4f60-90c8-0d43c5f6c0f6}
dd 22345200h
dw 0abe8h, 4f60h
db 90h,0c8h, 0dh,43h,0c5h,0f6h,0c0h,0f6h
Добавлено через 5 минут
Для masm32 в windows.inc есть структура:
Assembler
1
2
3
4
5
6
GUID    STRUCT
    Data1   dd ?
    Data2   dw ?
    Data3   dw ?
    Data4   db 8 dup(?)
GUID ENDS
Использовать её можно так:
Assembler
1
iid GUID {22345200h, 0abe8h, 04f60h, {90h,0c8h, 0dh,43h,0c5h,0f6h,0c0h,0f6h}}
Не вот прям удобно, но лучше, чем ничего.
0
0 / 0 / 1
Регистрация: 06.02.2020
Сообщений: 20
19.03.2020, 22:26  [ТС]
Assembler
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
.data?
        array dd ?
.const
        iid dq 11CEF82D37A378C0h,62122E2B000865AEh
.code
start:      push eax
        call _imp__CoInitialize@4
        push eax
            push esp
        call _imp__SHGetDesktopFolder@4
        pop eax
        mov edi,offset array
        push 16
        pop[edi]
        mov[edi+4],eax
        push eax
            push esp
            push edi
        call _imp__SHCreateShellFolderView@8
        pop ecx
        mov eax,[ecx]
        push eax
            push esp
            push offset iid
            push ecx
        call near ptr[eax]
        pop ecx
        mov eax,[ecx]
            push ecx
        call near ptr[eax+28]
        ret
end start
У меня нет уверенности, что смещение метода AutoArrange посчитано правильно. Вызов метода интерфейса возвращает единицу. Режим автоматического выравнивания значков на рабочем столе не активируется.
0
4190 / 1838 / 221
Регистрация: 06.10.2010
Сообщений: 4,124
20.03.2020, 04:57
Смещение должно быть 24, если верить этому - https://github.com/misi62/Code... ShlExt.pas.
0
0 / 0 / 1
Регистрация: 06.02.2020
Сообщений: 20
20.03.2020, 10:23  [ТС]
С 24 смещением метод возвращает ноль. Но не работает. Галочка в меню отсутствует.
0
4190 / 1838 / 221
Регистрация: 06.10.2010
Сообщений: 4,124
22.03.2020, 16:20
Похоже, что функции SHCreateShellFolderView и IShellFolder::CreateViewObject создают новый ListView.

Как получить интерфейс IShellView для существующего окна написано тут - https://devblogs.microsoft.com/oldnewthing/?p=4933
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
22.03.2020, 16:20
Помогаю со студенческими работами здесь

Как получить указатель на QString
И так вопрос: Я работаю с qt, и тут мне понадобилось получить адрес строки QString. Я создал QLineEdit *CheckText = new QLineEdit; ...

Получить указатель на массив указателей
Есть массив инициализированных указателей: Result* res; for (int i=0;i<100; i++) { res=new Result(); } Подскажите...

Получить текущий указатель на строку
через ADOTable

Qt - Получить указатель на ячейку в QTableView
Доброго времени суток! Пытаюсь программно выделить строку в QTableView, для этого посылаю сигнал о клике мыши. Только вот кому его...

Как получить указатель на функцию
Здравствуйте! Подскажите, как получить указатель на функцию? Амперсанд не помогает. class Menu{ private: //...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
15
Ответ Создать тему
Новые блоги и статьи
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит переходные токи и напряжения на элементах схемы. . . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru