Страницы: 1
RSS
Адаптация кода для 64 битных систем - VBA
 
Добрый день

помогите адаптировать код см.ниже что бы работал на 64 битной системе
Код
 Private Type GUID
    Data1 As Long
    Data2 As Integer
    Data3 As Integer
    Data4(0 To 7) As Byte
 End Type
 Private Declare Function CoCreateGuid Lib "ole32" (pguid As GUID) As Long
Private Declare Function StringFromGUID2 Lib "ole32" ( _
  rguid As GUID, ByVal lpsz As Long, ByVal cchMax As Long) As Long
    
 Public Function CreateGUID() As String
  Dim NewGUID As GUID
  CoCreateGuid NewGUID
  CreateGUID = Space$(38)
  StringFromGUID2 NewGUID, StrPtr(CreateGUID), 39
 End Function
 
 если можно с комментариями, спасибо.

пробую вот так 

Private Type GUID
   Data1 As Long
   Data2 As Integer
   Data3 As Integer
   Data4(0 To 7) As Byte
End Type
#If Win64 Then
Private Declare PtrSafe Function CoCreateGuid Lib "ole32" (pguid As GUID) As LongPtr
Private Declare PtrSafe Function StringFromGUID2 Lib "ole32" ( _
   rguid As GUID, ByVal lpsz As Long, ByVal cchMax As Long) As LongPtr
   #Else
   Private Declare Function CoCreateGuid Lib "ole32" (pguid As GUID) As Long
Private Declare Function StringFromGUID2 Lib "ole32" ( _
   rguid As GUID, ByVal lpsz As Long, ByVal cchMax As Long) As Long
   #End If
   
Public Function CreateGUID() As String
 Dim NewGUID As GUID
 CoCreateGuid NewGUID
 CreateGUID = Space$(38)
 StringFromGUID2 NewGUID, StrPtr(CreateGUID), 39
End Function
Sub dfvfb()

Dim GUID
GUID = LCase(Mid(CreateGUID(), 2, 36))
MsgBox GUID

End Sub

ругается  на StrPtr(CreateGUID)
Изменено: K_E_V - 10.03.2018 12:26:43
 
Ответ на аналогичный вопрос и ссылку на инструкции Microsoft см. тут
Владимир
 
Вот такая адаптация. Я использую #If VBA7. Это нужно для работы с версиями "Excel 2007-".
И внес только одно изменение:
Код
ByVal lpsz As LongPtr

Все остальное не менял.
Скрытый текст
 
Karataev Спасибо большое, помогло - все работает.
Как вы поняли что именно у ByVal lpsz As LongPtr нужно изменить Long на LongPtr?
Изменено: K_E_V - 11.03.2018 11:03:39
 
Потому что в этом месте происходила ошибка "несоответствие типов". Значит Long не подходит для 64, остается LongLong.
Но записать LongLong нельзя, т.к. перестанет работать в 32. Поэтому нужно вместо LongLong написать LongPtr.
Изменено: Karataev - 11.03.2018 11:08:11
 
Сейчас подумал и что-то я запутался в VBA7 и Win64. На первый взгляд и такой вариант подойдет с Win64:
Код
#If Win64 Then
    Private Declare PtrSafe Function CoCreateGuid Lib "ole32" (pguid As GUID) As Long
    Private Declare PtrSafe Function StringFromGUID2 Lib "ole32" ( _
        rguid As GUID, ByVal lpsz As LongLong, ByVal cchMax As Long) As Long
#Else
    Private Declare Function CoCreateGuid Lib "ole32" (pguid As GUID) As Long
    Private Declare Function StringFromGUID2 Lib "ole32" ( _
        rguid As GUID, ByVal lpsz As Long, ByVal cchMax As Long) As Long
#End If
 
Да я попробовал и с VBA7 и Win64 - работает в обоих случаях
Страницы: 1
Наверх