Вообщем недоработка когда интерфесы записывваешь в фал 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)