SSecurity писал(а):Но меня теребит вопрос, - можно ли обратившись по имени файла, определить версию, набор классов в длл-ке? (как без предварительной регистрирации компонента в системе, так и после оной).
Antonariy писал(а):Порочная архитектура. Для небольших проектов она громоздка, для больших вредна. Если ошибешься в какой-нибудь библиотеке в классе Info, рискуешь получить ошибку типа или объект не поддерживает свойство или метод. Если уж делаешь "кирпичное" приложение, то не поленись сделать еще одну dll с интерфейсом для Info. А вообще для любого "кирпичного" приложения достаточно двух-трех интерфейсов, которыми можно описать любой тип взаимодействий между любыми его частями.
Я пробовал. Замучался с расчетом координат элементов отчета и суботчетов при выводе на принтер. Перешел на HTML. Рекомендую заценить мой контрол HTML Form из проектов - он как раз использует html-шаблоны с расширенным синтаксисом для вывода рекордсетов в html. А точнее не синтаксисом, а дополнительными атрибутами. И не только вывода.Может в этом случае лучше замутить свой редактор отчетов, как и подобает со своим синтаксисом, а отчеты хранить в отдельных файлах
Antonariy писал(а):Я пробовал. Замучался с расчетом координат элементов отчета и суботчетов при выводе на принтер. Перешел на HTML. Рекомендую заценить мой контрол HTML Form из проектов - он как раз использует html-шаблоны с расширенным синтаксисом для вывода рекордсетов в html. А точнее не синтаксисом, а дополнительными атрибутами. И не только вывода.
regsvr32 [имя длл файла] /s
Antonariy писал(а):Таки да.
Но меня теребит вопрос, - можно ли обратившись по имени файла, определить версию, набор классов в длл-ке? (как без предварительной регистрирации компонента в системе, так и после оной).
Option Explicit
Private Declare Function RegOpenKeyEx Lib "advapi32" Alias "RegOpenKeyExA" _
(ByVal hKey As Long, ByVal lpSubKey As String, ByVal ulOptions As Long, _
ByVal samDesired As Long, phkResult As Long) As Long
Private Declare Function RegCloseKey Lib "advapi32" (ByVal hKey As Long) As Long
Private Declare Function RegQueryValueExStr Lib "advapi32" Alias "RegQueryValueExA" _
(ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, _
ByRef lpType As Long, ByVal szData As String, ByRef lpcbData As Long) As Long
Private Declare Function RegQueryValueExLong Lib "advapi32" Alias "RegQueryValueExA" _
(ByVal hKey As Long, ByVal lpValueName As String, ByVal lpReserved As Long, _
ByRef lpType As Long, szData As Long, ByRef lpcbData As Long) As Long
Public Function astcGetObject(ByVal Path As String, Optional ByVal ClassName As String) As Object
'On Error Resume Next
Dim c As TypeLibInfo
Dim sGuid As String
Dim fName As String
'TLBINF32.dll
Set c = TLI.TypeLibInfoFromFile(Path)
If c.CoClasses.Count <= 0 Then
Exit Function
End If
If ClassName = "" Then
sGuid = c.CoClasses.Item(1).Guid
Else
sGuid = c.CoClasses.NamedItem(ClassName).Guid
End If
fName = GetClassString(sGuid)
MsgBox GetClassString(c.CoClasses.Item(1).Guid)
MsgBox GetClassString(c.CoClasses.Item(2).Guid)
MsgBox GetClassString(c.CoClasses.Item(3).Guid)
End Function
Private Function GetClassString(ByVal sGuid As String) As String
Const HKEY_CLASSES_ROOT = &H80000000
Dim lpSubKey As String
Dim cData As Long, sData As String, ordType As Long, e As Long
Dim hKey As Long
lpSubKey = "CLSID\" & sGuid
e = RegOpenKeyEx(HKEY_CLASSES_ROOT, lpSubKey, 0, 1, hKey)
e = RegQueryValueExLong(hKey, "", 0&, ordType, 0&, cData)
sData = String$(cData - 1, 0)
e = RegQueryValueExStr(hKey, "", 0&, ordType, sData, cData)
RegCloseKey (hKey)
GetClassString = sData
End Function
Private Sub Command1_Click()
astcGetObject "C:\Documents and Settings\pashkov\Рабочий стол\VB6_TreeView_Full_Source\Release\vbalTreeView6.ocx"
End Sub
Public Sub ShameOnAdo()
MsgBox "ADO в пролёте"
End Sub
Private Sub Form_Load()
Call CreateObject("ADODB.Connection").ShameOnAdo
End Sub
а как этого избежать?
Хакер писал(а):(Ерунда какая-то) Что значит "динамически"? Знаешь способ создавать COM-компоненты статически?а как этого избежать?
Ну никто же не заставляет тебя пользоваться для индентификации класса progid-ом. Пользуйся CLSID-ом, никогда не ошибёшься.
слово ДИНАМИЧЕСКИ относится к процессу создания объекта внутри самой программы
Сейчас этот форум просматривают: Google-бот, SemrushBot, Yandex-бот и гости: 3