Страница: 1 |
Страница: 1 |
Вопрос: PB/DLL/CoCreateInstance
Добавлено: 27.01.07 02:24
Автор вопроса: HACKER
Есть неработающий код
%USEMACROS = 1
#INCLUDE "Win32API.inc"
GLOBAL ghInstance AS DWORD
TYPE GUID128
DWORD0 AS LONG
DWORD1 AS LONG
DWORD2 AS LONG
DWORD3 AS LONG
END TYPE
DECLARE FUNCTION UuidFromString LIB "rpcrt4" ALIAS "UuidFromStringA" ( _
BYVAL lpUUIDString AS STRING, _
lpUUID AS GUID128) AS LONG
FUNCTION LIBMAIN (BYVAL hInstance AS LONG, _
BYVAL fwdReason AS LONG, _
BYVAL lpvReserved AS LONG) AS LONG
SELECT CASE fwdReason
CASE %DLL_PROCESS_ATTACH
CALL LoadDll("D0FDBA39-A376-4D02-9D7D-D1A61A532EE6", _
"E41311EF-9297-4CBC-A280-5229D861F32A")
ghInstance = hInstance
FUNCTION = 1
CASE %DLL_PROCESS_DETACH
FUNCTION = 1 'success!
CASE %DLL_THREAD_ATTACH
CALL LoadDll("D0FDBA39-A376-4D02-9D7D-D1A61A532EE6", _
"E41311EF-9297-4CBC-A280-5229D861F32A")
FUNCTION = 1
CASE %DLL_THREAD_DETACH
FUNCTION = 1 'success!
END SELECT
END FUNCTION
SUB LoadDll(sObjectCLSID AS STRING, sInterfaceIID AS STRING)
DIM mObjectCLSID AS GUID128
DIM mInterfaceIID AS GUID128
'Определяем UUID'ы класса и интерфейса
CALL UuidFromString (sObjectCLSID, mObjectCLSID)
CALL UuidFromString (sInterfaceIID, mInterfaceIID)
' Создаем объект
IF CoCreateInstance(mObjectCLSID, 0&, &H5, mInterfaceIID, 0) <> 0 THEN
MSGBOX "Неудалость инициализировать объект"
END IF
END SUB
Компилится, но CoCreateInstance не 0 возвращает, соответственно объект не инициализируется.
Ситуация такая:
Необходимо было написать dll, которая бы подгружала другую dll (ActiveX), т.к. активикс то не грузится через LoadLibrary.. а эта грузится, но почему нехочет загружать мою dll непойму, ведь аналогичный код на VB6 нормально работает.
Есть подозрения, может всётаки нельзя из одной dll загружать другую?
Ответы
Всего ответов: 9
Номер ответа: 1
Автор ответа:
Sharp
Лидер форума
ICQ: 216865379
Вопросов: 106
Ответов: 9979
Web-сайт:
Профиль | | #1
Добавлено: 27.01.07 14:55
В DllMain лучше не стоит. Есть некоторое время, за которое DLL должна вернуть из нее управление.
Номер ответа: 2
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #2
Добавлено: 27.01.07 20:44
EntryPoint ?
создать отдельный поток?
А по сабжу, че CoCreateInstance объект не создает?
Номер ответа: 3
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #3
Добавлено: 29.01.07 10:58
Этот код работает в том же потоке что и вызывающий его из VB? Ибо я CoInitialize не вижу...
ЗЫ Почему не юзаем CLSIDFromString & IIDFromString?
ЗЫЫ Немного странный контекст - CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER
Это что на первый взгляд...
Номер ответа: 4
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #4
Добавлено: 30.01.07 00:32
Да, в вб6 просто LoadLibrary и вылетает MSGBOX "Неудалость инициализировать объект"
Пробовал, непонравилось Зачем если есть UuidFromString ?
Может я конечно не правельно нашёл значение константы, но помойму
Что собственно и делал
IF CoCreateInstance(mObjectCLSID, 0&, &H5, mInterfaceIID, 0) <> 0 THEN
Ну только константу опустил
PS Возможно протупил насчёт последнего, т.к. не очень въехал в суть вопроса (замечания)...
Номер ответа: 5
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #5
Добавлено: 30.01.07 11:36
Ну, не знаю, че то ты греешься...
Не знаю как насчет PB, или в чем ты там пишешь, но на ВБ приведу простой пример создания адошного рекордсета с поздним связыванием (че первым в голову пришло )
Option Explicit
Private Type UUID
 ata1 As Long
 ata2 As Integer
 ata3 As Integer
 ata4(7) As Byte
End Type
Private Declare Function CLSIDFromString Lib "ole32" (ByVal lpsz As Long, pclsid As UUID) As Long
Private Declare Function CoCreateInstance Lib "ole32" (rclsid As UUID, pUnkOuter As Any, ByVal dwClsContext As Long, riid As UUID, ppv As Any) As Long
Private Sub Form_Load()
Dim RetVal As Long
Dim RecordDisp As Object
Dim CLSID As UUID
Dim IID As UUID
Dim CLSSrting As String
Dim IIDString As String
CLSSrting = "{00000535-0000-0010-8000-00AA006D2EA4}"
IIDString = "{00020400-0000-0000-C000-000000000046}"
CLSIDFromString StrPtr(CLSSrting), CLSID
CLSIDFromString StrPtr(IIDString), IID
CoCreateInstance CLSID, ByVal 0, &H5, IID, RecordDisp
End Sub
Как видишь, все просто. На других диалектах бейсика, кроме Q и ZX, извиняй, не работал, потому сказать ниче не могу
Номер ответа: 6
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #6
Добавлено: 30.01.07 11:40
ЗЫ Я честно не знаю что значат твои LoadDll. Если это относится к активиксу - то это бред. Никаких загрузок ActiveX.Dll вручную!
Попробуй все же вызвать CoInitialize, мож и впрямь в другом потоке пускаешь...
Номер ответа: 7
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #7
Добавлено: 30.01.07 22:59
Номер ответа: 8
Автор ответа:
LamerOnLine
ICQ: 334781088
Вопросов: 108
Ответов: 2822
Профиль | | #8
Добавлено: 31.01.07 10:55
В смысле тебя не должна волновать загрузка ActiveX модулей. Это сделает COM. Все что тебе нужно - инициализировать COM, корректно получить CLSID, IID и корректно вызвать CoCreateInstace. Всё.
Ты проверял результаты получения CLSID и IID? И посмотри на номер ошибки, возвращаемый CoCreateInstace. Вместо того чтобы гадать на кофейной гуще
Номер ответа: 9
Автор ответа:
HACKER
Разработчик Offline Client
Вопросов: 236
Ответов: 8362
Профиль | | #9
Добавлено: 31.01.07 22:34
А где ж я про модули волновался, я вроде всё и деле как ты описал, только CLSID и IID через UuidFromString поулчал, а не CLSIDFromString... Ладно, в любом случае за пример спасибо. Попробую его на PB нарисовать, чуть позже.. отпишусь потом