purebasic.info

PureBasic forum
Текущее время: Пт июл 20, 2018 4:22 am

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




Начать новую тему Ответить на тему  [ Сообщений: 19 ]  На страницу 1, 2  След.
Автор Сообщение
 Заголовок сообщения: CoInitialize_(0) и MessageRequester()
СообщениеДобавлено: Пн фев 02, 2015 1:34 am 
Не в сети
профессор

Зарегистрирован: Ср янв 14, 2009 4:12 pm
Сообщений: 2002
Благодарил (а): 12 раз.
Поблагодарили: 101 раз.
Пункты репутации: 43
Заметил странную штуку. Если в коде программы присутствует MessageRequester(), то не работает API функция CoInitialize_(0), возвращает S_FALSE, а должна S_OK Если заменить пуриковскую MessageRequester на апишку MessageBox, то все работает норм. :? Это только у меня?
Win 7 64, PB 5.30
Код:
1
2
3
4
5
hr = CoInitialize_(0)
 
MessageRequester("Achtung", "Enter Char")  : Debug hr            ; hr = 1
 
;MessageBox_(0, "Achtung", "Enter Char", 0)  : Debug hr              ; hr = 0


_________________
Всё должно быть просто, настолько просто, насколько возможно, но не проще. (c) Альберт Эйнштейн
Изображение


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: CoInitialize_(0) и MessageRequester()
СообщениеДобавлено: Пн фев 02, 2015 7:52 am 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Пн июл 04, 2011 7:38 am
Сообщений: 749
Откуда: Россия
Благодарил (а): 29 раз.
Поблагодарили: 9 раз.
Пункты репутации: 0
Win8 x64, PureBasic 5.22 LTS тоже самое.

_________________
medium.com/@afonichev.dev


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: CoInitialize_(0) и MessageRequester()
СообщениеДобавлено: Пн фев 02, 2015 10:37 am 
Не в сети
профессор

Зарегистрирован: Ср янв 14, 2009 4:12 pm
Сообщений: 2002
Благодарил (а): 12 раз.
Поблагодарили: 101 раз.
Пункты репутации: 43
win xp sp 3
PB 5.22
PB 4.30
PB 4.51
PB 4.60
PB 5.11
Везде тоже самое. Неужели раньше никто не замечал :?:

_________________
Всё должно быть просто, настолько просто, насколько возможно, но не проще. (c) Альберт Эйнштейн
Изображение


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: CoInitialize_(0) и MessageRequester()
СообщениеДобавлено: Пн фев 02, 2015 11:05 am 
Не в сети
МОДЕРАТОР

Зарегистрирован: Вт дек 05, 2006 8:46 am
Сообщений: 6324
Благодарил (а): 19 раз.
Поблагодарили: 189 раз.
Пункты репутации: 48
pablov писал(а):
Заметил странную штуку. Если в коде программы присутствует MessageRequester(), то не работает API функция CoInitialize_(0), возвращает S_FALSE, а должна S_OK

Я ни чего не понял с перевода Гугла, но почему ДОЛЖНА S_OK?
Цитата:
Инициализирует COM библиотеку в текущем потоке и определяет модель параллелизма как одном потоке квартиры (STA).

Где там потоки, СОМ либа и о какой квартире идет речь?

_________________
read-only


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: CoInitialize_(0) и MessageRequester()
СообщениеДобавлено: Пн фев 02, 2015 12:04 pm 
Не в сети
профессор

Зарегистрирован: Ср янв 14, 2009 4:12 pm
Сообщений: 2002
Благодарил (а): 12 раз.
Поблагодарили: 101 раз.
Пункты репутации: 43
kvitaliy писал(а):
Я ни чего не понял с перевода Гугла, но почему ДОЛЖНА S_OK?
Цитата:
Инициализирует COM библиотеку в текущем потоке и определяет модель параллелизма как одном потоке квартиры (STA).

Где там потоки, СОМ либа и о какой квартире идет речь?

Я тоже не силен в этих COM интерфейсах, но если CoInitialize() отработает НЕ удачно, то не будут работать остальные функции из либы ole32.dll
но почему ДОЛЖНА S_OK?
Все функции из ole32.dll при успехе вертают ноль, т.е. #S_OK
MSDN
Цитата:
Return code Description

S_OK The COM library was initialized successfully on this thread.
S_FALSE The COM library is already initialized on this thread.

Получается, что COM library уже инициализирована, а по факту нет, т.к. не работает к пр. ф-ия CoCreateInstance_(...). Так что сдается мне что это баг пурика, но вот почему раньше никто не заметил?

_________________
Всё должно быть просто, настолько просто, насколько возможно, но не проще. (c) Альберт Эйнштейн
Изображение


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: CoInitialize_(0) и MessageRequester()
СообщениеДобавлено: Пн фев 02, 2015 12:28 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11206
Благодарил (а): 4 раз.
Поблагодарили: 421 раз.
Может не совсем правильный метод, но он работает.
Код:
1
2
3
4
CoUninitialize_()
hr = CoInitialize_(0)
Debug hr
MessageRequester("Achtung", "Enter Char")


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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: CoInitialize_(0) и MessageRequester()
СообщениеДобавлено: Пн фев 02, 2015 1:08 pm 
Не в сети
профессор

Зарегистрирован: Ср янв 14, 2009 4:12 pm
Сообщений: 2002
Благодарил (а): 12 раз.
Поблагодарили: 101 раз.
Пункты репутации: 43
Петр, качественный костыль :D
Получается баг. Как думаете, стоит отправить Фреду?

_________________
Всё должно быть просто, настолько просто, насколько возможно, но не проще. (c) Альберт Эйнштейн
Изображение


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: CoInitialize_(0) и MessageRequester()
СообщениеДобавлено: Пн фев 02, 2015 1:35 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11206
Благодарил (а): 4 раз.
Поблагодарили: 421 раз.
Напиши. Если баг, может исправят когда-нибудь. Если не баг, может объяснят причину этого.

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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: CoInitialize_(0) и MessageRequester()
СообщениеДобавлено: Пн фев 02, 2015 3:01 pm 
Не в сети
профессор

Зарегистрирован: Ср янв 14, 2009 4:12 pm
Сообщений: 2002
Благодарил (а): 12 раз.
Поблагодарили: 101 раз.
Пункты репутации: 43
Что-то не могу залогинится на http://forums.purebasic.com, а регаться по новой влом
Кому не трудно, сообщите Фреду, об этом баге

_________________
Всё должно быть просто, настолько просто, насколько возможно, но не проще. (c) Альберт Эйнштейн
Изображение


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: CoInitialize_(0) и MessageRequester()
СообщениеДобавлено: Пн фев 02, 2015 4:35 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Чт июн 25, 2009 1:02 pm
Сообщений: 2281
Откуда: Russia — Belarus
Благодарил (а): 6 раз.
Поблагодарили: 72 раз.
Пункты репутации: 11
pablov писал(а):
Что-то не могу залогинится на http://forums.purebasic.com, а регаться по новой влом
Кому не трудно, сообщите Фреду, об этом баге

http://www.purebasic.fr/english/viewtop ... =4&t=61557

_________________
EnableExplicit User


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: CoInitialize_(0) и MessageRequester()
СообщениеДобавлено: Пн фев 02, 2015 4:47 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11206
Благодарил (а): 4 раз.
Поблагодарили: 421 раз.
Там во втором коде есть ошибка и нужно бы ее исправить.
Код:
1
Debug CoInitialize_(0)("", "")


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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: CoInitialize_(0) и MessageRequester()
СообщениеДобавлено: Пн фев 02, 2015 5:26 pm 
Не в сети
профессор
Аватар пользователя

Зарегистрирован: Чт июн 25, 2009 1:02 pm
Сообщений: 2281
Откуда: Russia — Belarus
Благодарил (а): 6 раз.
Поблагодарили: 72 раз.
Пункты репутации: 11
Пётр писал(а):
Там во втором коде есть ошибка и нужно бы ее исправить.

Исправил.

Один чел походу уже отписал что-то дельное.

_________________
EnableExplicit User


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: CoInitialize_(0) и MessageRequester()
СообщениеДобавлено: Пн фев 02, 2015 6:43 pm 
Не в сети
профессор

Зарегистрирован: Ср янв 14, 2009 4:12 pm
Сообщений: 2002
Благодарил (а): 12 раз.
Поблагодарили: 101 раз.
Пункты репутации: 43
qpAHToMAS писал(а):
Один чел походу уже отписал что-то дельное.

Что там дельного, отписал что по какой-то причине вызывается Coinitialize() и сослался на тему Петра
PS Фантомас, спасибо за сообщение на оф. форум

_________________
Всё должно быть просто, настолько просто, насколько возможно, но не проще. (c) Альберт Эйнштейн
Изображение


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: CoInitialize_(0) и MessageRequester()
СообщениеДобавлено: Пн фев 02, 2015 7:27 pm 
Не в сети
МОДЕРАТОР
Аватар пользователя

Зарегистрирован: Пн апр 09, 2007 4:53 pm
Сообщений: 11206
Благодарил (а): 4 раз.
Поблагодарили: 421 раз.
pablov писал(а):
Я тоже не силен в этих COM интерфейсах, но если CoInitialize() отработает НЕ удачно, то не будут работать остальные функции из либы ole32.dll
Не помешало бы увидеть пример. Потому что на оф. форуме похоже не понимают в чем ошибка и видимо по их мнению она лишь в том что CoInitialize() возвращает S_FALSE. Что само по себе не является ошибкой, а лишь свидетельствует о том, что либа уже проинициализирована.

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


Вернуться наверх
 Профиль  
 
 Заголовок сообщения: Re: CoInitialize_(0) и MessageRequester()
СообщениеДобавлено: Пн фев 02, 2015 8:00 pm 
Не в сети
профессор

Зарегистрирован: Ср янв 14, 2009 4:12 pm
Сообщений: 2002
Благодарил (а): 12 раз.
Поблагодарили: 101 раз.
Пункты репутации: 43
Пётр писал(а):
Не помешало бы увидеть пример. Потому что на оф. форуме похоже не понимают в чем ошибка и видимо по их мнению она лишь в том что CoInitialize() возвращает S_FALSE. Что само по себе не является ошибкой, а лишь свидетельствует о том, что либа уже проинициализирована.

Вот пример, при нормальном выполнении в окне дебуга будут имена драйверов звуковых устройств
Если разремить MessageRequester("", ""), код не выполнится, т.к. CoInitialize_(0) вернет #S_FALSE

Пример для Висты и выше!
Поставить галку Unicode в настройках компиля

Код:
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
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
#STGM_READ      = 0
#STGM_WRITE     = 1
#STGM_READWRITE = 2
 
#CLSCTX_INPROC_SERVER  = $01
#CLSCTX_INPROC_HANDLER = $02
#CLSCTX_LOCAL_SERVER   = $04
#CLSCTX_REMOTE_SERVER  = $10
 
#CLSCTX_ALL    = #CLSCTX_INPROC_SERVER|#CLSCTX_INPROC_HANDLER|#CLSCTX_LOCAL_SERVER|#CLSCTX_REMOTE_SERVER
#CLSCTX_INPROC = #CLSCTX_INPROC_SERVER|#CLSCTX_INPROC_HANDLER
#CLSCTX_SERVER = #CLSCTX_INPROC_SERVER|#CLSCTX_LOCAL_SERVER|#CLSCTX_REMOTE_SERVER
 
; DEVICE_STATE_XXX constants:
#DEVICE_STATE_ACTIVE     = 1   ; The audio endpoint device is active.
#DEVICE_STATE_DISABLED   = 2   ; The audio endpoint device is disabled.
#DEVICE_STATE_NOTPRESENT = 4   ; https://msdn.microsoft.com/en-us/library/windows/desktop/dd370823%28v=vs.85%29.aspx
#DEVICE_STATE_UNPLUGGED  = 8
#DEVICE_STATEMASK_ALL    = $0f
 
#eRender              = 0
#eCapture             = 1
#eAll                 = 2
#EDataFlow_enum_count = 3
 
Structure PROPERTYKEY
  fmtid.GUID  
  pid.i
EndStructure
;  
Interface IPropertyStore Extends IUnknown    ; https://msdn.microsoft.com/ru-ru/library/windows/desktop/bb761474%28v=vs.85%29.aspx
  Commit()
  GetAt(iProp, *pkey.PROPERTYKEY)
  GetCount(*cProps)
  GetValue(key.PROPERTYKEY, *pv)
  SetValue(key.PROPERTYKEY, *propvar)
EndInterface
;
Interface IMMNotificationClient Extends IUnknown
  OnDefaultDeviceChanged(*flow, *role, *pwstrDefaultDevice)
  OnDeviceAdded(*pwstrDeviceId)
  OnDeviceRemoved(*pwstrDeviceId)
  OnDeviceStateChanged(*pwstrDeviceId, dwNewState)  
  OnPropertyValueChanged(*pwstrDeviceId, key.PROPERTYKEY)
EndInterface
;
Interface IMMDevice Extends IUnknown
    Activate.l(*iid.IID, dwClsCtx, *pActivationParams, *ppInterface)
    OpenPropertyStore.l(stgmAccess, *ppProperties.IPropertyStore)
    GetId.l(*pwstrId.String)    
    GetState.l(*pdwState)
EndInterface
 
Interface IMMDeviceCollection Extends IUnknown
  GetCount(*pcDevices)            
  Item(nDevice, *ppDevice.IMMDevice)
EndInterface
 
Interface IMMDeviceEnumerator Extends IUnknown
    EnumAudioEndpoints.l(dataFlow.l, dwStateMask.l, *ppDevices.IMMDeviceCollection)
    GetDefaultAudioEndpoint.l(dataFlow.l, role.l, *ppDevice.IMMDevice)
    GetDevice.l(pwstrId.l, *ppDevice.IMMDevice)
    RegisterEndpointNotificationCallback.l(*pNotify.IMMNotificationClient)
    UnregisterEndpointNotificationCallback.l(*pNotify.IMMNotificationClient)
EndInterface
 
Procedure EnumDevices()
 
hr = CoInitialize_(0)
If hr = #S_OK
   If CoCreateInstance_(?CLSID_MMDeviceEnumerator, #Null, #CLSCTX_INPROC_SERVER, ?IID_IMMDeviceEnumerator, @iidDE.IMMDeviceEnumerator) = #S_OK
     If  iidDE\EnumAudioEndpoints(#eRender, #DEVICE_STATE_ACTIVE, @ppDevices.IMMDeviceCollection) = #S_OK
         If ppDevices\GetCount(@*pcDevices) = #S_OK
           If *pcDevices
             For i = 0 To *pcDevices - 1
               If ppDevices\Item(i, @*ppDevice.IMMDevice) = #S_OK
                 *ppDevice\GetId(@*pwstrId)
                 Debug PeekS(*pwstrId)
              EndIf
            Next
          EndIf
         EndIf
     EndIf
   EndIf  
   CoUninitialize_()
EndIf
 
EndProcedure
 
EnumDevices()
 
;MessageRequester("", "")
 
DataSection
 
  CLSID_MMDeviceEnumerator:
 Data.l $BCDE0395                         ; {BCDE0395-E52F-467C-8E3D-C4579291692E}
  Data.w $E52F,$467C
  Data.b $8E,$3D,$C4,$57,$92,$91,$69,$2E
 
  IID_IMMDeviceEnumerator:
 Data.l $A95664D2                         ; {A95664D2-9614-4F35-A746-DE8DB63617E6}
  Data.w $9614,$4F35
  Data.b $A7,$46,$DE,$8D,$B6,$36,$17,$E6
 
EndDataSection


_________________
Всё должно быть просто, настолько просто, насколько возможно, но не проще. (c) Альберт Эйнштейн
Изображение


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

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


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

Сейчас этот форум просматривают: Google [Bot] и гости: 1


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

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