Гость
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / А что, в VB среде и в "EXE" логика разная? / 15 сообщений из 15, страница 1 из 1
01.09.2012, 21:44
    #37940129
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
А что, в VB среде и в "EXE" логика разная?
Исходный код C++
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
        numDevs = waveOutGetNumDevs();
        do {
          PCaselessString str;
          if (GetWaveOutDeviceName(id, str) && str == device.Mid(offset)) {
            deviceName = str;
            break;
          }
        } while (++id < numDevs);


был мной переписан на VB6 как
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
        numDevs = waveOutGetNumDevs
        Do
          If (GetWaveOutDeviceName(id, str)) And (str = device) Then
            devicename = str
            Exit Do
          End If
          id = id + 1
        Loop While (id < numDevs)


Я проверял в VB-среде все работает как надо.
Запускаю скомпилированный exe -выдает чушь (неправильное имя звукового устройства).
Начал копать.
Тонкое место оказалось:
Код: vbnet
1.
  If (GetWaveOutDeviceName(id, str)) And (str = device) Then


Т.е. проверка во второй части : str = device
Должна использовать str, вычесленное в первой части: GetWaveOutDeviceName(id, str)
где все аргументы ByRef так понимаю
Код: vbnet
1.
Private Function GetWaveOutDeviceName(id As Long, name As String) As Boolean



Так вот: в случае VB-среды используется str, вычисленное в первой части
В случае exe используется str, которое было ранее (до выполнения первой части).

Я конечно перекатал код в виде:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
        numDevs = waveOutGetNumDevs
        Do
          If GetWaveOutDeviceName(id, str) Then
            If (str = device) Then
              devicename = str
              Exit Do
            End If
          End If
          id = id + 1
        Loop While (id < numDevs)


и стало как надо, но чет меня не очень порадовало такое положение дел.
Просто еще пришлось сломать мозг чтоб этот кусок найти.
...
Рейтинг: 0 / 0
01.09.2012, 22:06
    #37940137
VSVLAD
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
А что, в VB среде и в "EXE" логика разная?
Дмитрий77где все аргументы ByRef так понимаю
Не правильно. Все параметры API должны вызываться как ByVal (ну кроме структур, и явной передачи указателя через As Any/саму переменную)
...
Рейтинг: 0 / 0
01.09.2012, 22:09
    #37940138
VSVLAD
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
А что, в VB среде и в "EXE" логика разная?
Кстати, GetWaveOutDeviceName в какой библиотеке определяется? она не стандартная? Что-то не гуглится.
И приведите её декларацию
...
Рейтинг: 0 / 0
01.09.2012, 23:12
    #37940163
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
А что, в VB среде и в "EXE" логика разная?
VSVLADКстати, GetWaveOutDeviceName в какой библиотеке определяется? она не стандартная? Что-то не гуглится.
И приведите её декларацию

В моем модуле она определяется. id -на входе; name-на выходе
ID в принципе можно было бы ByVal, но name точно ByRef
Все эти ф-ции построены по одному принципу (типа той что привел).
Если false , то "не удалось"
Если true, то берем значение (параметр в аргументах).
Что касается API, то либо
0=MMSYSERR_NOERROR -> ведет к true
либо
<>0 -номер ошибки -> ведет к false

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
Private Declare Function waveOutGetDevCaps Lib "winmm.dll" Alias "waveOutGetDevCapsA" _
 (ByVal uDeviceID As Long, lpCaps As WAVEOUTCAPS, ByVal uSize As Long) As Long


Private Function GetWaveOutDeviceName(id As Long, name As String) As Boolean
  If id = WAVE_MAPPER Then
    name = "Default"
    GetWaveOutDeviceName = True
    Exit Function
  End If

  Dim caps As WAVEOUTCAPS
  If (waveOutGetDevCaps(id, caps, Len(caps)) <> 0) Then
    GetWaveOutDeviceName = False
    Exit Function
  End If
  
  name = Left(caps.szPname, InStr(1, caps.szPname, Chr(0)) - 1)
  GetWaveOutDeviceName = True
End Function



Исходник на C++:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
static bool GetWaveOutDeviceName(UINT id, PString & name)
{
  if (id == WAVE_MAPPER) {
    name = "Default";
    return true;
  }

  WAVEOUTCAPS caps;
  if (waveOutGetDevCaps(id, &caps, sizeof(caps)) != 0)
    return false;

  name = PString(caps.szPname).Trim();
  return true;
}



Но ваши возражения не по теме вопроса.
...
Рейтинг: 0 / 0
02.09.2012, 01:06
    #37940208
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
А что, в VB среде и в "EXE" логика разная?
Как ниже по крайней мере не воспроизводится. (всегда "yes")
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
Private Sub Command1_Click()
  Dim str As String, device As String
  device = "bla-bla-bla"
  If getX(str) And str = device Then
    MsgBox "yes"
  End If
End Sub

Function getX(x As String) As Boolean
  x = "bla-bla-bla"
  getX = True
End Function


Короче полечил и ладно.
...
Рейтинг: 0 / 0
02.09.2012, 09:20
    #37940266
VSVLAD
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
А что, в VB среде и в "EXE" логика разная?
Дмитрий77,

Вопрос был, что в среде и в скомпилированном варианте по разному выполняется код. Делаю аналогию (частично код не был предоставлен, некоторые объявления, параметры вызова - пришлось придумать самому)
Код: vbnet
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.
Option Explicit

Private Declare Function waveOutGetDevCaps Lib "winmm.dll" Alias "waveOutGetDevCapsA" (ByVal uDeviceID As Long, lpCaps As WAVEOUTCAPS, ByVal uSize As Long) As Long
Private Declare Function waveOutGetNumDevs Lib "winmm.dll" () As Long

Private Const MAXPNAMELEN As Long = 32
Private Const WAVE_MAPPER As Long = -1&

Private Type WAVEOUTCAPS
    wMid As Integer
    wPid As Integer
    vDriverVersion As Long
    szPname As String * MAXPNAMELEN
    dwFormats As Long
    wChannels As Integer
    dwSupport As Long
End Type

Private Function GetWaveOutDeviceName(id As Long, name As String) As Boolean
  If id = WAVE_MAPPER Then
    name = "Default"
    GetWaveOutDeviceName = True
    Exit Function
  End If

  Dim caps As WAVEOUTCAPS
  If (waveOutGetDevCaps(id, caps, Len(caps)) <> 0) Then
    GetWaveOutDeviceName = False
    Exit Function
  End If
  
  name = Left(caps.szPname, InStr(1, caps.szPname, Chr(0)) - 1)
  GetWaveOutDeviceName = True
End Function

Private Sub Command1_Click()
    Dim numDevs As Long, DeviceName As String
    Dim str As String, id As Long, Device As String
    
    numDevs = waveOutGetNumDevs
    Device = "Динамики (Устройство с поддержк" 'Дефолтное имя устойства Windows 7
    					       'именно в таком виде так как буфер 32 байта - определено из API Viewer)
    Do
        If (GetWaveOutDeviceName(id, str)) And (str = Device) Then
            DeviceName = str
            MsgBox str
            Exit Do
        End If
        
        id = id + 1
    Loop While (id < numDevs)
End Sub



При выполнении в скомпилированному варианте и в среде - я вижу сообщение. Т.е. условие проходит успешно, т.е. Имя устройства совпадает.

Так что мои возражения были по теме (Так как не было известно что это API или самописаная функция).
Лучше приложите полные объявления и констант и структур, а лучше минимальный код, чтобы можно было проблему смоделировать
...
Рейтинг: 0 / 0
02.09.2012, 14:59
    #37940412
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
А что, в VB среде и в "EXE" логика разная?
VSVLADЛучше приложите полные объявления и констант и структур, а лучше минимальный код, чтобы можно было проблему смоделировать
Ловите тестовый проект.
В соседней теме: 13101249
Кстати м.б. тогда прокомментируете заданные там вопросы? Я вижу Вы разбираетесь.
Идеи всех функций в основном брались отсюда:
http://opalvoip.svn.sourceforge.net/viewvc/opalvoip/ptlib/branches/v2_10/src/ptlib/msos/sound_win32.cxx?revision=28275&content-type=text%2Fplain
причем часть изменений (в части mute контролов и нахождения микрофона -актуально для XP) была сделана мной (см.хронологию:)
http://opalvoip.svn.sourceforge.net/viewvc/opalvoip/ptlib/branches/v2_10/src/ptlib/msos/sound_win32.cxx?view=log
Логика функций о которых говорим (получение имен девайсов, ID и т.п.) перекатано оттуда.

Да, еще.
Мне очень не нравится, ваш же код это показывает:
Код: vbnet
1.
2.
3.
4.
5.
6.
Private Const MAXPNAMELEN As Long = 32
...
    szPname As String * MAXPNAMELEN
...
    Device = "Динамики (Устройство с поддержк" 'Дефолтное имя устойства Windows 7
    					       'именно в таком виде так как буфер 32 байта - определено из API Viewer)


Хотя это и не мешает выбирать подобный девайс на Win7 (благодаря тому что согласно структуре кода этот глюк "обратимый").

Сейчас работаю в этом направлении. Хотя направление решения уже найдено:

Идея:
waveOutGetDevCaps, Win7 and long device names

Кажется реализация:
http://files.codes-sources.com/fichier_fullscreen.aspx?id=47768&f=class%2FclsAfMasterVolume.cls]class/clsAfMasterVolume.cls du code source VOLUME MASTER : ETAT VOLUME WINDOWS - MODIFIER LE VOLUME, LE MUTE, ET OBTENIR DES INFORMATIONS SUR LA CARTE SON [MODULE DE CLASSE]

Если удастся допилить, возможно выложу.
...
Рейтинг: 0 / 0
02.09.2012, 16:24
    #37940460
VSVLAD
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
А что, в VB среде и в "EXE" логика разная?
Дмитрий77,

Посмотрел проект, работает регулировка звука в ехе и в среде, имена устройств выводит теже, не меньше не больше. Только для регулировки звука создаётся "свой миксер", не регулируется системный.



Ещё есть интересная статья , может поможет что решить. Про длину буфера для имени устройства ещё не смотрел, если будет время погляжу.
...
Рейтинг: 0 / 0
02.09.2012, 17:34
    #37940486
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
А что, в VB среде и в "EXE" логика разная?
VSVLAD,

VSVLADТолько для регулировки звука создаётся "свой миксер", не регулируется системный.
То что оно регулирует меня вполне устраивает.
В XP это будет (для Player) устройство "Wave" (Общая громкость -> звук) , в 7-ке видимо то что вы называете "свой миксер".
Я сначала хотел сделать "Volume Control" (Общая громкость -> общая), но получил возражения от разработчика Opal:

http://opalvoip.svn.sourceforge.net/viewvc/opalvoip/ptlib/branches/v2_10/src/ptlib/msos/sound_win32.cxx?view=log
Reversed out the previous sound volume changes for Windows MultiMedia API. They are too specific and do not support all devices, e.g. USB headset. Code was returned to the original, which set the master volume control.
Так что здесь все в порядке.

VSVLADПосмотрел проект, работает регулировка звука в ехе и в среде, имена устройств выводит теже, не меньше не больше.
В проекте модифицированный вариант кода. См. Private Function GetDeviceID
Вы заменяли на мой первый вариант?:
Код: vbnet
1.
If (GetWaveOutDeviceName(id, str)) And (str = device) Then


У вас одно звуковое устройство? У меня на тестовом компьютере несколько, включая всякие хз с чем есть "Модем #6 Линейный вход".
Смотрите картинку ниже.
Я утверждаю, что при первом варианте кода при выборе в листбоксах "Realtek HD.. " и нажатии <Start>, будут выбраны (вернее не выбраны так как их нет) контролы для "Модем #6... ", то бишь str=device в exe-шнике выполнится только на следующем шаге цикла, а не на текущем. А в VB среде выберется "Realtek HD.. ", как задумано.


VSVLADПро длину буфера для имени устройства ещё не смотрел, если будет время погляжу.
Через waveOutGetDevCaps вы ничего не добьетесь.
Надо думать в том направлении что я указал (французский пример).
Я его сейчас аккуратно переписываю, даже не прочь выложить то что есть на сейчас
(функция PrintEndpointNames).
Но, я дошел до места где автор честно споткнулся:
Код: vbnet
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.
'                               PROPVARIANT varName;
                                Dim varName As PROPVARIANT
                                
'                               // Initialize container for property value.
'                               PropVariantInit(&varName);
                                varName.vt = VT_LPWSTR

'                               // Get the endpoint's friendly-name property.
'                               hr = pProps->GetValue(PKEY_Device_FriendlyName, &varName);
                                ''*****************  LA LIGNE CI-DESSOUS CRASH VB SOUS WINDOWS VISTA  *************************
                                'hr = CallPointer(vIPropertyStoreInterface.GetValue, hlPropertyStore, PKEY_Device_FriendlyName, VarPtr(varName.Data))
                                ''*********************************************************************************************
                                hr = 0
                                
'                               EXIT_ON_ERROR (hr)
                                If Not (hr = INTERFACE_NOERROR) Then
                                    bExitLoop = True
                                
                                Else
'                                   // Print endpoint friendly name and endpoint ID.
'                                   printf("Endpoint %d: \"%S\" (%S)\n", i, varName.pwszVal, pwszID);
                                    ''*****************  TODO  ****************
                                    
'                                   CoTaskMemFree(pwszID);
                                    CoTaskMemFree hlPointerID
                                    
'                                   pwszID = NULL;
                                    hlPointerID = 0
                                    
'                                   PropVariantClear(&varName);
                                    ''*****************  TODO  ****************


Смотрим
PROPVARIANT structure
У автора написано:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
Private Type PROPVARIANT 'http://msdn.microsoft.com/en-us/library/aa380072(v=vs.85).aspx
    vt                                      As Long
    data                                    As Long
    ptr                                     As Long
    wReserved1                              As Long
    wReserved2                              As Long
    wReserved3                              As Long
End Type


По успешному опыту борьбы с Unin-ами в Opal
я попробовал так:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
Private Type PROPVARIANT 'http://msdn.microsoft.com/en-us/library/aa380072(v=vs.85).aspx
  vt                                      As Long 'VT_LPWSTR
  wReserved1                              As Long
  wReserved2                              As Long
  wReserved3                              As Long
  pwszVal                                 As Long 'LPWSTR pwszVal;
                                                  'A pointer to a null-terminated Unicode string
                                                  'in the user default locale.


Но что-то у меня на 7-ке все одно все крашит, чеб я не делал. (на XP этот код запускать бессмысленно)
Код: vbnet
1.
hr = CallPointer(vIPropertyStoreInterface.GetValue, hlPropertyStore, PKEY_Device_FriendlyName, VarPtr(varName))


-вот здесь
Взгляните, м.б. найдем идею?
А то обидно - на последней структуре споткнуться когда уже все раскурочено и казалось бы иголка в яйце - вот она -ан нет, тамо бомба и она взрывается.
...
Рейтинг: 0 / 0
02.09.2012, 17:36
    #37940489
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
А что, в VB среде и в "EXE" логика разная?
Вот кстати оригинальный французский пример (на всякий случай):
...
Рейтинг: 0 / 0
03.09.2012, 06:12
    #37940738
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
А что, в VB среде и в "EXE" логика разная?
А как на VB6 перевести:

Код: plaintext
1.
DEFINE_PROPERTYKEY (PKEY_Device_FriendlyName, 0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, 14);



Сдается мне, что
Код: vbnet
1.
Private Const PKEY_Device_FriendlyName              As Long = &H1 'constante personelle, ''TODO а vйrifier


это чистой воды отсебятина автора, а потому и крашит.
...
Рейтинг: 0 / 0
03.09.2012, 10:24
    #37940866
скукотища
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
А что, в VB среде и в "EXE" логика разная?
Дмитрий77А как на VB6 перевести:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
DEFINE_PROPERTYKEY (
  PKEY_Device_FriendlyName,                         // 'Name'
// GUID here -->
  0xa45c254e,                                       // DWORD
  0xdf1c,                                           // WORD
  0x4efd,                                           // WORD
  0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0,   // BYTE(7)
// <--
  14                                               // 'PID'
);



Сдается мне, что
Код: vbnet
1.
Private Const PKEY_Device_FriendlyName              As Long = &H1 'constante personelle, ''TODO а vйrifier


это чистой воды отсебятина автора, а потому и крашит.

msdn DEFINE_PROPERTYKEY mscro
...
Рейтинг: 0 / 0
03.09.2012, 18:02
    #37941799
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
А что, в VB среде и в "EXE" логика разная?
скукотища,
за подсказку спасибо, уже где-то близко мыслил.
Пока не пробовал, но смотрите:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
Private Type GUID 'http://msdn.microsoft.com/en-us/library/aa379358%28v=vs.85%29.aspx
  Data1           As Long
  Data2           As Integer
  Data3           As Integer
  Data4(7)        As Byte
End Type

Private Type PROPERTYKEY 'http://msdn.microsoft.com/en-us/library/windows/desktop/dd758071%28v=vs.85%29.aspx
  the_GUID As GUID
  the_PID As Long
End Type


Имеем:
Код: plaintext
1.
DEFINE_PROPERTYKEY(PKEY_Device_FriendlyName,           0xa45c254e, 0xdf1c, 0x4efd, 0x80, 0x20, 0x67, 0xd1, 0x46, 0xa8, 0x50, 0xe0, 14);    // DEVPROP_TYPE_STRING


Наверно так:

Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Private Const GUID_PKEY_Device_FriendlyName         As String = "{A45C254E-DF1C-4EFD-8020-67D146A850E0}"
Private Const PID_PKEY_Device_FriendlyName          As Long = 14

Private Declare Function IIDFromString Lib "ole32.dll" (ByVal lpszIID As Long, ByRef IID As GUID) As Long

  Dim PKEY_Device_FriendlyName As PROPERTYKEY
  With PKEY_Device_FriendlyName
    IIDFromString StrPtr(GUID_PKEY_Device_FriendlyName), .the_GUID
    .the_PID = PID_PKEY_Device_FriendlyName
  End With



Дальше мне надо сделать IPropertyStore::GetValue method
(ниже нерабочий авторский код, где он тупо сует
PKEY_Device_FriendlyName As Long = &H1 'constante personelle в чем видимо неправ):
Код: vbnet
1.
2.
3.
4.
5.
' // Get the endpoint's friendly-name property.
'hr = pProps->GetValue(PKEY_Device_FriendlyName, &varName);
''*****************  LA LIGNE CI-DESSOUS CRASH VB SOUS WINDOWS VISTA  
'hr = CallPointer(vIPropertyStoreInterface.GetValue, hlPropertyStore, PKEY_Device_FriendlyName, VarPtr(varName.Data))
''**********************************************************************


Т.е. теперь мою структуру PKEY_Device_FriendlyName 3-им параметром туда засунуть?
А как?
PKEY_Device_FriendlyName 'my
или
varptr(PKEY_Device_FriendlyName)

Я хоть на верном пути?
...
Рейтинг: 0 / 0
04.09.2012, 23:02
    #37943604
скукотища
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
А что, в VB среде и в "EXE" логика разная?
> Дмитрий77
> Т.е. теперь мою структуру PKEY_Device_FriendlyName 3-им параметром туда засунуть?
> А как?
> PKEY_Device_FriendlyName 'my
> или
> varptr(PKEY_Device_FriendlyName)

Однаковенно, т.к. пользовательские типы в VB всегда передаются по ссылке.


* * * * * * * * *
ЗЫ:
> Я хоть на верном пути?
Насчёт Дао, здесь 13101649 Вы объявляете пользовательский тип PROPVARIANT.
Может для IPropertyStore::GetValue в качестве выходного параметра подойдёт нативный VB-шный Variant ?
...
Рейтинг: 0 / 0
05.09.2012, 00:27
    #37943661
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
А что, в VB среде и в "EXE" логика разная?
скукотища,

Так все уже доделал, взгляните на рабочий код:
Получение длинных имен аудиоустройств на Vista/Win7
скукотища> varptr(PKEY_Device_FriendlyName)
Однаковенно, т.к. пользовательские типы в VB всегда передаются по ссылке.
Именно так и надо.
скукотищаВы объявляете пользовательский тип PROPVARIANT.
Может для IPropertyStore::GetValue в качестве выходного параметра подойдёт нативный VB-шный Variant ?
C Юнионами я собаку съел когда с Opal API разбирался.
Да пользовательский. И надо так:
Код: vbnet
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
Private Type PROPVARIANT 'http://msdn.microsoft.com/en-us/library/aa380072(v=vs.85).aspx
  vt                                      As Integer 'VT_LPWSTR
  wReserved1                              As Integer
  wReserved2                              As Integer
  wReserved3                              As Integer
  pwszVal                                 As Long   ' union LPWSTR pwszVal;
                                                    'A pointer to a null-terminated Unicode string
                                                    'in the user default locale.
  Padding As Long ' 16 Bytes
End Type


И если бы мне надо было получать PROPVARIANT разных типов (а здесь я знаю чего придет), то в данном случае я бы тупо возвратил ptr as long, скопировал бы 2 байта в Integer (vt), а в завис. от этого выбрал бы PROPVARIANT_typeN (можно даже сразу выкинуть первый параметр vt) и скопировал бы оставшиеся len(PROPVARIANT_typeN ) байтов в PROPVARIANT_typeN. Здесь просто ясно что vt=31(VT_LPWSTR).

Я думаю, что французский вариант допиливается точно также:
У автора несколько ошибок:
1) Не разобрался с PROPERTYKEY PKEY_Device_FriendlyName
На самом деле достаточно знать PID=14, а GUID можно получить перебором через IPropertyStoreInterface::GetAt (i, &PROPERTYKEY)
2) Он неправильно записал PROPVARIANT
3) Он перепутал последовательность IPropertyStoreInterface::function что существенно
Методом тыка я установил что ::GetCount=3; GetAt=4; GetValue=5; SetValue=6
Автор пытается выполнить [6], я в конце концов увидел эту -2147024891 (Нет разрешения на выполнение ф-ции), а при STGM_READ из всех их только >>>Set<<<Value не может быть выполнена.

Но вообще конечно прикольно, первый раз с подобными кодами сталкиваюсь.
...
Рейтинг: 0 / 0
Форумы / Visual Basic [игнор отключен] [закрыт для гостей] / А что, в VB среде и в "EXE" логика разная? / 15 сообщений из 15, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]