Преобразование GUID

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 28.10.2005 (Пт) 9:16

Кстати, попробуй привести то, что ты показал в отладчике к типу stdole.guid
У тебя первый параметр - long, следующие два int, остальные 8 - byte. Тип stdole.guid предствляет собой

Код: Выделить всё
Type
    Data1 as ?
    Data2 as ?
    Data3 as ?
    Data4 as Byte(0 to 7)
End Type

что в принцыпе одно и то же.
? - означает, что я не уверен в типе параметров, по-моему все long; если что, Темыч подскажет.
А потом попробуй еще раз StringFromGUID2
Последний раз редактировалось Antonariy 28.10.2005 (Пт) 9:17, всего редактировалось 1 раз.
Лучший способ понять что-то самому — объяснить это другому.

Vi
Постоялец
Постоялец
 
Сообщения: 739
Зарегистрирован: 25.01.2002 (Пт) 11:03
Откуда: Россия, Ижевск

Сообщение Vi » 28.10.2005 (Пт) 9:17

Код: Выделить всё
Private Type GUID
    Data1 As Long: Data2 As Integer: Data3 As Integer: Data4(0 To 7) As Byte
End Type

  Dim g As GIUD, v ' этот v - это ortDC.Id
  CopyMemory g, ByVal VarPtr(v) + 8, Len(g)

Теперь этот g должен содержать твою структуру, которую уже можно передавать дальше.

PS
Кстати, есть оператор LSet для преобразования одной структуры в другую.
Код: Выделить всё
Private Type GUID
    Data1 As Long: Data2 As Integer: Data3 As Integer: Data4(0 To 7) As Byte
End Type
Private Type GUID_NET
    a As Long: b As Integer: c As Integer
    d As Byte: e As Byte: f As Byte: g As Byte: h As Byte: i As Byte: j As Byte: k As Byte
End Type

  Dim g1 As GUID, g2 As GUID_NET
  LSet g1 = g2

Только нужно получить g2.
Последний раз редактировалось Vi 28.10.2005 (Пт) 9:23, всего редактировалось 1 раз.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! (с) КВН

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 28.10.2005 (Пт) 9:19

Опаньки, а вот и подсказочка по типам :wink:
Пока писал, кому-то та же идея в голову пришла. :roll:
Лучший способ понять что-то самому — объяснить это другому.

Vi
Постоялец
Постоялец
 
Сообщения: 739
Зарегистрирован: 25.01.2002 (Пт) 11:03
Откуда: Россия, Ижевск

Сообщение Vi » 28.10.2005 (Пт) 9:27

А может:
Код: Выделить всё
Private Declare Function StringFromGUID2 Lib "ole32" (Byval LPrguid As long, ByVal lpsz As Long, ByVal cchMax As Long) As Long

И вызывать так:
Код: Выделить всё
StringFromGUID2 ByVal VarPtr(v) + 8, StrPtr(s), Len(s)

где v - переданный Variant
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! (с) КВН

Medved_
Новичок
Новичок
Аватара пользователя
 
Сообщения: 48
Зарегистрирован: 27.10.2005 (Чт) 11:12
Откуда: E-burg

Сообщение Medved_ » 28.10.2005 (Пт) 10:35

2Vi: 1. LSET - type mismatch: LSet g_net = ortDC.ID
2. не работает такой вызов StringFromGUID2 - каждый раз при новом запуске получаю новую строку ГУИД по одним и тем же данным.
Последний раз редактировалось Medved_ 28.10.2005 (Пт) 10:42, всего редактировалось 1 раз.
With the BEST regards,
Medved.

Medved_
Новичок
Новичок
Аватара пользователя
 
Сообщения: 48
Зарегистрирован: 27.10.2005 (Чт) 11:12
Откуда: E-burg

Сообщение Medved_ » 28.10.2005 (Пт) 10:37

2Antonariy: А как организовать приведение к этому типу ч/з stdole? Что-то я непонимаю... :(
With the BEST regards,
Medved.

Medved_
Новичок
Новичок
Аватара пользователя
 
Сообщения: 48
Зарегистрирован: 27.10.2005 (Чт) 11:12
Откуда: E-burg

Сообщение Medved_ » 28.10.2005 (Пт) 10:37

Antonariy писал(а):tyomitch
Откуда он возьмется в ОбъектБровзере, если создается поздним связыванием? Да и в референсы не добавишь, потому что это не com, а .net framework класс. Возможно по этому и не помогают все эти телодвижения со StringFromGUID2
Именно!!
With the BEST regards,
Medved.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 28.10.2005 (Пт) 10:44

2Antonariy: А как организовать приведение к этому типу ч/з stdole? Что-то я непонимаю...

Код: Выделить всё
dim g as GUID
g.Data1=ortDC.Id._a
g.Data2=ortDC.Id._b
g.Data3=ortDC.Id._c
g.Data4(0)=ortDC.Id._d
g.Data4(1)=ortDC.Id._e
и т.д.

Тип GUID объявлять не надо.
Лучший способ понять что-то самому — объяснить это другому.

Medved_
Новичок
Новичок
Аватара пользователя
 
Сообщения: 48
Зарегистрирован: 27.10.2005 (Чт) 11:12
Откуда: E-burg

Сообщение Medved_ » 28.10.2005 (Пт) 10:51

2Antonariy:
в тексте модуля редактор сразу ругается на "_а" - именно на "_" - Invalid character :evil:
А в окне "Watches" - при написании "ortDC.Id._a" - Invalid watch expression :evil:
Жоппппа!!! :cry:
Если б я так мог "достучаться" до содержимого ortDC.Id - я б не просил помощи в конференции... :oops:
With the BEST regards,
Medved.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 28.10.2005 (Пт) 10:53

Попробуй ortDC.Id.[_a]
Лучший способ понять что-то самому — объяснить это другому.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 28.10.2005 (Пт) 10:55

Кстати, GIUD описать все-таки надо.
Лучший способ понять что-то самому — объяснить это другому.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 28.10.2005 (Пт) 11:01

В догонку: если не получится с ortDC.Id.[_a], попробуй x=CallByName(ortDC.Id, "_a", VbGet)
Лучший способ понять что-то самому — объяснить это другому.

Medved_
Новичок
Новичок
Аватара пользователя
 
Сообщения: 48
Зарегистрирован: 27.10.2005 (Чт) 11:12
Откуда: E-burg

Сообщение Medved_ » 28.10.2005 (Пт) 11:10

2Vi: ч/з CopyMemory - то ж не проканывает - не ч/з раз, но ч/з два - разные данные в g... ;(
With the BEST regards,
Medved.

Medved_
Новичок
Новичок
Аватара пользователя
 
Сообщения: 48
Зарегистрирован: 27.10.2005 (Чт) 11:12
Откуда: E-burg

Сообщение Medved_ » 28.10.2005 (Пт) 11:16

Antonariy писал(а):В догонку: если не получится с ortDC.Id.[_a], попробуй x=CallByName(ortDC.Id, "_a", VbGet)
На оба действия - Object required. Попробовал другие объявления "_а" - то же самое... :cry: :cry: Крыша уже едет!
With the BEST regards,
Medved.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 28.10.2005 (Пт) 11:18

Что выдает Len(ortDC.Id)?
Лучший способ понять что-то самому — объяснить это другому.

Medved_
Новичок
Новичок
Аватара пользователя
 
Сообщения: 48
Зарегистрирован: 27.10.2005 (Чт) 11:12
Откуда: E-burg

Сообщение Medved_ » 28.10.2005 (Пт) 11:26

2Antonariy:
Type mismatch

ЗЫ: Пробовал пройтись For each G_net in ortDC.Id по содержимому ortDC.Id - та же ошибка. Причем редактор еще требует объявить G_net как Variant - на начале цикла и вылетает ошибка... :evil: :evil: :evil: :evil: :evil: :evil:
With the BEST regards,
Medved.

Medved_
Новичок
Новичок
Аватара пользователя
 
Сообщения: 48
Зарегистрирован: 27.10.2005 (Чт) 11:12
Откуда: E-burg

MS .NET Framework

Сообщение Medved_ » 28.10.2005 (Пт) 11:32

Кстати, народ! :idea:
Я се установил на тачку MS .NET Framework. :!:
Как можно правильно подключиться к .NET Framework Class Library и достать метод Guid.ToString Method () из простого VB ? :?:
With the BEST regards,
Medved.

Vi
Постоялец
Постоялец
 
Сообщения: 739
Зарегистрирован: 25.01.2002 (Пт) 11:03
Откуда: Россия, Ижевск

Сообщение Vi » 28.10.2005 (Пт) 11:43

Я бы скопировал ortDC.Id в вариант, потому что, кажется, что ortDC - это объект, а Id - это свойство его.
Код: Выделить всё
Dim v
v = ortDC.Id

И использовать адрес "ByVal VarPtr(v) + 8" для получения доступа к структуре, которая содержится в Варианте.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! (с) КВН

Medved_
Новичок
Новичок
Аватара пользователя
 
Сообщения: 48
Зарегистрирован: 27.10.2005 (Чт) 11:12
Откуда: E-burg

Сообщение Medved_ » 28.10.2005 (Пт) 11:57

2Vi:
Опять же разные данные в v...
With the BEST regards,
Medved.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 28.10.2005 (Пт) 12:02

Сдаюсь.
Последнее, что могу посоветовать:
http://msdn.microsoft.com/vbrun/vbfusio ... fault.aspx
Лучший способ понять что-то самому — объяснить это другому.

Antonariy
Повелитель Internet Explorer
Повелитель Internet Explorer
Аватара пользователя
 
Сообщения: 4824
Зарегистрирован: 28.04.2005 (Чт) 14:33
Откуда: Мимо проходил

Сообщение Antonariy » 28.10.2005 (Пт) 12:12

Попробуй VarPtr без всяких +8

CopyMemory g, VarPtr(ortDC.Id), 16
или
CopyMemory VarPtr(g), VarPtr(ortDC.Id), 16
Лучший способ понять что-то самому — объяснить это другому.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 28.10.2005 (Пт) 12:22

Antonariy писал(а):Откуда он возьмется в ОбъектБровзере, если создается поздним связыванием? Да и в референсы не добавишь, потому что это не com, а .net framework класс. Возможно по этому и не помогают все эти телодвижения со StringFromGUID2

Короче.

Если .NET-сборка используется из VB6, это означает, что присутствует COM-wrapper, который зарегистрирован по правилам COM.
Также это означает, что есть tlb, которую .NET генерирует для того, чтобы было легко использовать эту сборку.
Эта tlb уже либо подключена (и тогда нажми-таки F2), либо ещё нет (и тогда подключи). Подключи и посмотри, что там за тип GUID.
А как ещё, ты думаешь, VB узнаёт, что это Variant\Guid? Только он в рантайме, а ты подключи, всё-таки.
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Vi
Постоялец
Постоялец
 
Сообщения: 739
Зарегистрирован: 25.01.2002 (Пт) 11:03
Откуда: Россия, Ижевск

Сообщение Vi » 28.10.2005 (Пт) 13:24

Простите, сбился на один уровень косвенности. Вот такой должен быть код:
Код: Выделить всё
  Dim v, pos As Long
  CopyMemory pos, ByVal VarPtr(v) + 8, 4
  CopyMemory g, ByVal pos, Len(g)

Или
Код: Выделить всё
Private Declare Function StringFromGUID2 Lib "ole32" (Byval LPrguid As long, ByVal lpsz As Long, ByVal cchMax As Long) As Long

  Dim v, pos As Long
  CopyMemory pos, ByVal VarPtr(v) + 8, 4
  StringFromGUID2 ByVal pos, StrPtr(s), Len(s)
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! (с) КВН

Medved_
Новичок
Новичок
Аватара пользователя
 
Сообщения: 48
Зарегистрирован: 27.10.2005 (Чт) 11:12
Откуда: E-burg

Сообщение Medved_ » 31.10.2005 (Пн) 9:07

GSerg писал(а):Подключи и посмотри, что там за тип GUID.
А как ещё, ты думаешь, VB узнаёт, что это Variant\Guid? Только он в рантайме, а ты подключи, всё-таки.
Угу. Нашел. Подключил. Нашел описание ID - Property Id As GUID - пытаюсь дальше на него пройти - вылетает окошко с надписью: "Cannot jump to `GUID` because it is hidden." Вот так вот... :cry:
With the BEST regards,
Medved.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 31.10.2005 (Пн) 9:36

Правый клик, "Показывать скрытые объекты" и повторить операцию.
Lasciate ogni speranza, voi ch'entrate.

Medved_
Новичок
Новичок
Аватара пользователя
 
Сообщения: 48
Зарегистрирован: 27.10.2005 (Чт) 11:12
Откуда: E-burg

Сообщение Medved_ » 31.10.2005 (Пн) 10:21

2Antonariy:
Спасибо тебе. Натолкнул на мысль.
Только вместо указанного тобой по ссылке на MSDN System.dll из .NET Framework`а я подключил mscorlib.dll (Common Language Runtime Library из .NET Framework`а). Создал тип Dim myGUID As mscorlib.GUID. ему просто присвоил тот самый ID.
Получилось:
Код: Выделить всё
Private Declare Function StringFromGUID2 Lib "ole32.dll" _
    (pGuid As Any, ByVal PointerToString As Long, _
    ByVal MaxLength As Long) As Long

Dim myGUID As mscorlib.GUID

On Error GoTo ErrorHandler

myGUID = ortDC.Id
strGUID_ = String(38, 0)
StringFromGUID2 myGUID, StrPtr(strGUID_), 38 + 1


Аллес! :lol: :lol: :lol:
With the BEST regards,
Medved.

Medved_
Новичок
Новичок
Аватара пользователя
 
Сообщения: 48
Зарегистрирован: 27.10.2005 (Чт) 11:12
Откуда: E-burg

Сообщение Medved_ » 31.10.2005 (Пн) 10:23

alibek писал(а):Правый клик, "Показывать скрытые объекты" и повторить операцию.
:) Об этом я тут же догадался. Вкупе с ответом Antonariy - это меня и натолкнуло на решение.

ВСЕМ БОЛЬШОЕ СЕНКС!!! ВСЕ РАБОТАЕТ. Тему можно считать закрытой. :wink:
With the BEST regards,
Medved.

Пред.

Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 108

    TopList