Visual Basic, .NET, ASP, VBScript
 

   
   
     

Форум - Общий форум

Страница: 1 |

 

  Вопрос: PB/DLL/CoCreateInstance Добавлено: 27.01.07 02:24  

Автор вопроса:  HACKER
Есть неработающий код
#COMPILE DLL

%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-сайт: sharpc.livejournal.com
 Профиль | | #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
Этот код работает в том же потоке что и вызывающий его из VB?

Да, в вб6 просто LoadLibrary и вылетает MSGBOX "Неудалость инициализировать объект"

ЗЫ Почему не юзаем CLSIDFromString & IIDFromString?

Пробовал, непонравилось :) Зачем если есть UuidFromString ?

ЗЫЫ Немного странный контекст - CLSCTX_INPROC_SERVER|CLSCTX_LOCAL_SERVER


Может я конечно не правельно нашёл значение константы, но помойму

Private Const CLSCTX_SERVER         As Long = &H5


Что собственно и делал

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
    ;Data1 As Long
    ;Data2 As Integer
    ;Data3 As Integer
    ;Data4(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
Никаких загрузок ActiveX.Dll вручную!
всмысле?

Ответить

Номер ответа: 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 нарисовать, чуть позже.. отпишусь потом

Ответить

Страница: 1 |

Поиск по форуму



© Copyright 2002-2011 VBNet.RU | Пишите нам