Вообщем недоработка когда интерфесы записывваешь в фал pbi то тогда теряется автодополнение кода и приходится обращатся к файлу pbi чтобы скопировать и вставить код!
;{;Константы com
;wtypesbase.h
;CLSCTX Значения, которые используются в вызовах активации для указания контекстов выполнения, в которых должен выполняться объект.
;MSHCTX Указывает контекст назначения, т. е. процесс, в котором должна выполняться демаршалировка.
;MSHLFLAGS Указывает, почему должен выполняться маршалинг.
#CLSCTX_INPROC_SERVER = $1
#CLSCTX_INPROC_HANDLER = $2
#CLSCTX_LOCAL_SERVER = $4
#CLSCTX_INPROC_SERVER16 = $8
#CLSCTX_REMOTE_SERVER = $10
#CLSCTX_INPROC_HANDLER16 = $20
#CLSCTX_RESERVED1 = $40
#CLSCTX_RESERVED2 = $80
#CLSCTX_RESERVED3 = $100
#CLSCTX_RESERVED4 = $200
#CLSCTX_NO_CODE_DOWNLOAD = $400
#CLSCTX_RESERVED5 = $800
#CLSCTX_NO_CUSTOM_MARSHAL = $1000
#CLSCTX_ENABLE_CODE_DOWNLOAD = $2000
#CLSCTX_NO_FAILURE_LOG = $4000
#CLSCTX_DISABLE_AAA = $8000
#CLSCTX_ENABLE_AAA = $10000
#CLSCTX_FROM_DEFAULT_CONTEXT = $20000
#CLSCTX_ACTIVATE_X86_SERVER = $40000
#CLSCTX_ACTIVATE_32_BIT_SERVER=#CLSCTX_ACTIVATE_X86_SERVER
#CLSCTX_ACTIVATE_64_BIT_SERVER = $80000
#CLSCTX_ENABLE_CLOAKING = $100000
#CLSCTX_APPCONTAINER = $400000
#CLSCTX_ACTIVATE_AAA_AS_IU = $800000
#CLSCTX_RESERVED6 = $1000000
#CLSCTX_ACTIVATE_ARM32_SERVER = $2000000
;#CLSCTX_ALLOW_LOWER_TRUST_REGISTRATION=
#CLSCTX_PS_DLL = $80000000
;
#MSHCTX_LOCAL = 0
#MSHCTX_NOSHAREDMEM = 1
#MSHCTX_DIFFERENTMACHINE = 2
#MSHCTX_INPROC = 3
#MSHCTX_CROSSCTX = 4
;#MSHCTX_CONTAINER
;
#MSHLFLAGS_NORMAL=0
#MSHLFLAGS_TABLESTRONG=1
#MSHLFLAGS_TABLEWEAK=2
#MSHLFLAGS_NOPING=4
#MSHLFLAGS_RESERVED1=8
#MSHLFLAGS_RESERVED2=16
#MSHLFLAGS_RESERVED3=32
#MSHLFLAGS_RESERVED4=64
;==========================
;константы ошибок
#S_OK=0;Успешно
#S_FALSE=1;Успешно
#RPC_E_CHANGED_MODE=$80010106;Неизвестная ошибка
#E_ACCESSDENIED=$80070005;Доступ запрещен.
#E_FAIL=$80004005;Незаданная ошибка.
#E_INVALIDARG=$80070057;Недопустимое значение параметра.
#E_OUTOFMEMORY=$8007000E;Недостаточно памяти
#E_POINTER=$80004003;Значение NULL было передано неправильно для значения указателя.
#E_UNEXPECTED=$8000FFFF;Непредвиденное состояние
;
;LoadLibraryEx_() загрузка dll
#DONT_RESOLVE_DLL_REFERENCES=$00000001
#LOAD_IGNORE_CODE_AUTHZ_LEVEL=$00000010
#LOAD_LIBRARY_AS_DATAFILE=$00000002
#LOAD_LIBRARY_AS_DATAFILE_EXCLUSIVE=$00000040
#LOAD_LIBRARY_AS_IMAGE_RESOURCE=$00000020
#LOAD_LIBRARY_SEARCH_APPLICATION_DIR=$00000200
#LOAD_LIBRARY_SEARCH_DEFAULT_DIRS=$00001000
#LOAD_LIBRARY_SEARCH_DLL_LOAD_DIR=$00000100
#LOAD_LIBRARY_SEARCH_SYSTEM32=$00000800
#LOAD_LIBRARY_SEARCH_USER_DIRS=$00000400
#LOAD_WITH_ALTERED_SEARCH_PATH=$00000008
#LOAD_LIBRARY_REQUIRE_SIGNED_TARGET=$00000080
#LOAD_LIBRARY_SAFE_CURRENT_DIRS=$00002000
;
;CoInitializeEx_() инициализация com
#COINIT_APARTMENTTHREADED = $2;Инициализирует поток для параллелизма объектов с потоком в апартаменте
#COINIT_MULTITHREADED=0;Инициализирует поток для многопоточного параллелизма объектов
#COINIT_DISABLE_OLE1DDE = $4;Отключает поддержку DDE для OLE1.
#COINIT_SPEED_OVER_MEMORY = $8;Увеличьте использование памяти, чтобы повысить производительность.
;};;
;{;Структуры
Structure _GUID;_UUIDv5;формат UUID((UUIDv5))
Data_l.l;
Data_w1.u;
Data_w2.u;
Data_w3.u;
Data_b6.a[6];
EndStructure
Structure Object
*lpVtbl
nRefCount.l
nLockCount.l
EndStructure
;};
;{;Макросы
Macro FAILED(hr)
hr < 0
EndMacro
Macro SUCCEEDED(hr)
hr = 0
EndMacro
Macro CLSID_GUID(name, l, w1, w2,w3, b1, b2, b3, b4, b5, b6)
name\Data_l=l
name\Data_w1=w1
name\Data_w2=w2
name\Data_w3=w3
name\Data_w3=((name\Data_w3<<8) |(name\Data_w3>>8))
name\Data_b6[0]=b1
name\Data_b6[1]=b2
name\Data_b6[2]=b3
name\Data_b6[3]=b4
name\Data_b6[4]=b5
name\Data_b6[5]=b6
EndMacro
Macro MIDL_INTERFACE(name, l, w1, w2,w3, b1, b2, b3, b4, b5, b6)
name\Data_l=l
name\Data_w1=w1
name\Data_w2=w2
name\Data_w3=w3
name\Data_w3=((name\Data_w3<<8) |(name\Data_w3>>8))
name\Data_b6[0]=b1
name\Data_b6[1]=b2
name\Data_b6[2]=b3
name\Data_b6[3]=b4
name\Data_b6[4]=b5
name\Data_b6[5]=b6
;name\pid=4
EndMacro
Macro SetDataGuid_CLASS_And_INTERFACE(NameClsid,p1,p2,p3,p4,p5,p6,p7,p8,p9,p10,p11,NameInterface,i1,i2,i3,i4,i5,i6,i7,i8,i9,i10,i11)
DataSection
NameClsid:
Data.l p1
Data.w p2,p3
Data.b p4,p5,p6,p7,p8,p9,p10,p11
NameInterface:
Data.l i1
Data.w i2,i3
Data.b i4,i5,i6,i7,i8,i9,i10,i11
EndDataSection
EndMacro
;};
SetDataGuid_CLASS_And_INTERFACE(CLSID_PortableDeviceManager,$0af10cec,$2ecd,$4b92,$95,$81,$34,$f6,$ae,$06,$37,$f3,IPortableDeviceManager,$a1567595,$4c2f,$4574,$a6,$fa,$ec,$ef,$91,$7b,$9a,$40)
Interface IPortableDeviceManager Extends IUnknown
GetDevices(*pPnPDeviceIDs,*pcPnPDeviceIDs);Получает список портативных устройств, подключенных к компьютеру.
RefreshDeviceList();обновляет список устройств, подключенных к компьютеру
GetDeviceFriendlyName(*pszPnPDeviceID,*pDeviceFriendlyName,*pcchDeviceFriendlyName);Получает понятное имя для устройства
GetDeviceDescription(*pszPnPDeviceID,*pDeviceDescription,*pcchDeviceDescription);Получает описание устройства
GetDeviceManufacturer(*pszPnPDeviceID,*pDeviceManufacturer,*pcchDeviceManufacturer);Получает имя производителя устройства.
GetDeviceProperty(*pszPnPDeviceID,*pszDevicePropertyName,*pData,*pcbData,*pdwType);
GetPrivateDevices(*pPnPDeviceIDs,*pcPnPDeviceIDs);извлекает список частных портативных устройств, подключенных к компьютеру. Эти частные устройства доступны только через приложение, предназначенное для этих конкретных устройств.
EndInterface
Procedure.i EnumerateAllDevices()
Protected hr
Protected pnpDeviceIDCount = 0;
Protected deviceManager.IPortableDeviceManager;интерфейс deviceManager
CoInitializeEx_(0, 0)
hr = CoCreateInstance_(?CLSID_PortableDeviceManager,0,#CLSCTX_INPROC_SERVER,?IPortableDeviceManager,@deviceManager);
If (FAILED(hr))
Debug"error CoCreateInstance_()"
End
EndIf
If (SUCCEEDED(hr))
hr = deviceManager\GetDevices(0, @pnpDeviceIDCount)
If (FAILED(hr))
Debug"! error deviceManager\GetDevices()"
deviceManager\Release()
ProcedureReturn 0
Else
Debug "pnpDeviceIDCount "+Str(pnpDeviceIDCount)
If pnpDeviceIDCount > 0
Protected *PWSTR_PnPDeviceIDs.string=AllocateMemory(pnpDeviceIDCount*4);количество ссылок на строку
Protected *PWSTR_stroka=AllocateMemory(1000);строка для вывода
Protected PWSTR_stroka_len.i=500
hr = deviceManager\GetDevices(*PWSTR_PnPDeviceIDs,@pnpDeviceIDCount);
If (SUCCEEDED(hr))
hr=*PWSTR_PnPDeviceIDs
*PWSTR_PnPDeviceIDs+pnpDeviceIDCount*4-4
cikl:
Debug *PWSTR_PnPDeviceIDs\s
deviceManager\GetDeviceFriendlyName(@*PWSTR_PnPDeviceIDs\s,*PWSTR_stroka,@PWSTR_stroka_len)
Debug PWSTR_stroka_len
Debug PeekS(*PWSTR_stroka,-1,#PB_Unicode)
;
deviceManager\GetDeviceDescription(@*PWSTR_PnPDeviceIDs\s,*PWSTR_stroka,@PWSTR_stroka_len)
Debug PWSTR_stroka_len
Debug PeekS(*PWSTR_stroka,-1,#PB_Unicode)
deviceManager\GetDeviceManufacturer(@*PWSTR_PnPDeviceIDs\s,*PWSTR_stroka,@PWSTR_stroka_len)
Debug PWSTR_stroka_len
Debug PeekS(*PWSTR_stroka,-1,#PB_Unicode)
CoTaskMemFree_(@*PWSTR_PnPDeviceIDs);?
If *PWSTR_PnPDeviceIDs>hr
*PWSTR_PnPDeviceIDs-4
Goto cikl
EndIf
FreeMemory(*PWSTR_PnPDeviceIDs)
FreeMemory(*PWSTR_stroka)
deviceManager\Release()
ProcedureReturn 1
Else
deviceManager\Release()
ProcedureReturn 0
EndIf
Else;нет устройств
deviceManager\Release()
ProcedureReturn 0
EndIf
EndIf
EndIf
EndProcedure
Debug EnumerateAllDevices()
собственно если интерфейс поместить в фыл с расширением pbi и вызвать XIncludeFile "[имя файла].pbi" то теряется автодополнение кода
ps:повторюсь методы(функции,процедуры)в интерфейсе по расположению должны быть как в инклуднике а то столкнулся на сайте мелкософта свой порядок описания по ним и так расположил ,соответственно таблица ссылок на них нарушена и вылет программы....
Отредактировано Sergeihik (14.10.2023 13:20:55)