CoGetInterfaceAndReleaseStream возвращает DISP_E_BADVARTYPE
От: gfn Россия  
Дата: 20.05.04 09:33
Оценка:
Подскажите пожалуйста,

Соврешенно одинаковый код на разных машинах с одинаковой ОС (NT4)
работает по-разному.

Ситуация следующая: В главном потоке создается COM-объект,указатель на интерфейс которого маршалится в рабочие потоки.

Так вот, при размаршаливании в рабочих потоках CoGetInterfaceAndReleaseStream возвращает DISP_E_BADVARTYPE, хотя он не должен вообще возвращать такого значения! Интерфейс унаследован от IUnknown.

У меня на машине код работает нормально (интерфейс нормально размаршаливается и рабочие потоки вовсю его используют),а у заказчика вышеописанная проблема!
С чем это может быть связано?
Re: CoGetInterfaceAndReleaseStream возвращает DISP_E_BADVART
От: Mr_First  
Дата: 20.05.04 09:42
Оценка:
Здравствуйте, gfn, Вы писали:

Я раньше тоже юзал эти функции для межпоточного маршалинга, но потом меня их глючность начала доставать и я перешел на GIT (IGlobalInterfaceTable) и не каких проблем.
Глюки проявлялись тоже (как у тебя) в этой же функции, правда код ошибки я не помню.

Так что перелазь на GIT

p.s. в MSVC7 есть для него оберточка CComGITPtr.
Re: DISP_E_BADVARTYPE
От: Vi2 Удмуртия http://www.adem.ru
Дата: 20.05.04 10:14
Оценка:
Здравствуйте, gfn, Вы писали:

gfn>Так вот, при размаршаливании в рабочих потоках CoGetInterfaceAndReleaseStream возвращает DISP_E_BADVARTYPE, хотя он не должен вообще возвращать такого значения! Интерфейс унаследован от IUnknown.
gfn>С чем это может быть связано?

Это так или иначе связано с преобразованием VARIANTов через VariantChangeType или чтении этой информации из TLB.

Не используются ли в IDL файле типы, выходящие из ряда "нормальных", т.е. short, long, BSTR, SAFEARRAY и прочих, описанных в oleautomation? Или используются свои прокси/стабы?
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[2]: CoGetInterfaceAndReleaseStream возвращает DISP_E_BADV
От: gfn Россия  
Дата: 20.05.04 12:27
Оценка:
Здравствуйте, Mr_First, Вы писали:

Спасибо, переписал код с использованием IGlobalInterfaceTable.
У меня на машине работает. Передал заказчику. Надеюсь у него тоже будет работать. =()
Re[2]: DISP_E_BADVARTYPE
От: gfn Россия  
Дата: 20.05.04 12:37
Оценка:
Здравствуйте, Vi2, Вы писали:

Vi2>Это так или иначе связано с преобразованием VARIANTов через VariantChangeType или чтении этой информации из TLB.


Vi2>Не используются ли в IDL файле типы, выходящие из ряда "нормальных", т.е. short, long, BSTR, SAFEARRAY и прочих, описанных в oleautomation? Или используются свои прокси/стабы?


Интерфейс описан следующим образом:

    interface IFCStatistic3 : IUnknown
    {
        [id(1), helpstring("method Open")] HRESULT Open([in] BSTR Path);
        [id(2), helpstring("method AddOutBytes")] HRESULT AddOutBytes([in] BSTR bsQMgrName, [in] long Value);
        [id(3), helpstring("method AddInConfirms")] HRESULT AddInConfirms([in] BSTR bsQMgrName);
        [id(4), helpstring("method AddInBytes")] HRESULT AddInBytes([in] BSTR bsQMgrName, [in] long Value);
        [id(5), helpstring("method AddOutConfirms")] HRESULT AddOutConfirms([in] BSTR bsQMgrName);
        [id(6), helpstring("method AddInErrors")] HRESULT AddInErrors([in] BSTR bsQMgrName);
        [id(7), helpstring("method AddOutErrors")] HRESULT AddOutErrors([in] BSTR bsQMgrName);
        [id(8), helpstring("method GetInfo")] 
        HRESULT GetInfo(
            [out] DWORD * pnCount, 
            [out, size_is(,*pnCount)] struct_Statistic ** ppStatisticInfo );


};
Причем используется proxy/stub, живущий в отдельной dll.
Re[2]: DISP_E_BADVART
От: gfn Россия  
Дата: 21.05.04 08:44
Оценка:
Здравствуйте, Mr_First, Вы писали:

M_F> Так что перелазь на GIT


В общем не помогло, та же самая картина.
Re[3]: DISP_E_BADVARTYPE
От: Tom Россия http://www.RSDN.ru
Дата: 21.05.04 09:33
Оценка:
gfn>Причем используется proxy/stub, живущий в отдельной dll.

Давай полный IDL


HRESULT GetInfo(
            [out] DWORD * pnCount, 
            [out, size_is(,*pnCount)] struct_Statistic ** ppStatisticInfo );


Кстате вот это я так понимаю просто описка?
Да и ты уверен что прокся у заказчика нормально зарегистрировалась?
Народная мудрось
всем все никому ничего(с).
Re[4]: DISP_E_BADVARTYPE
От: gfn Россия  
Дата: 21.05.04 10:55
Оценка:
Здравствуйте, Tom, Вы писали:

Tom>Давай полный IDL

полный IDL привожу ниже

Tom>
Tom>HRESULT GetInfo(
Tom>            [out] DWORD * pnCount, 
Tom>            [out, size_is(,*pnCount)] struct_Statistic ** ppStatisticInfo );
Tom>


Tom>Кстате вот это я так понимаю просто описка?

Хде??
Tom>Да и ты уверен что прокся у заказчика нормально зарегистрировалась?
Да, в этом я уверен.

// ReceiveSendModule.idl : IDL source for ReceiveSendModule.dll

// This file will be processed by the MIDL tool to
// produce the type library (ReceiveSendModule.tlb) and marshalling code.

import "oaidl.idl";
import "ocidl.idl";

typedef struct
{
    DWORD    dwThreadId;
    BSTR    ThreadDescription; 
} struct_ThreadInfo;

typedef struct
{
    BSTR    bsMsgId;
    BSTR    bsFileName; 
    long    nFileTimeDate; // a-la time_t
    DWORD    dwFileSize;
    BSTR    bsAddress; 
    long    nFirstEventTime; // a-la time_t
    long    nSecondEventTime;// may be -1 (reception for received file)

} struct_ReceiptInfo;

typedef struct
{
    BSTR    bsQMgrName;
    DWORD    nFileSend;
    DWORD    nByteSend;
    DWORD    nReceiveConfirm;
    DWORD    nFileReceive;
    DWORD    nByteReceive;
    DWORD    nSendConfirm;
    DWORD    nInError;
    DWORD    nOutError;
} struct_Statistic;

    interface IFCStatistic3;
    [
        object,
        uuid (eeb8a950-b844-11d7-9981-0080ad174992),//(19e8ba70-48ae-11d7-a264-0080ad174992),//(473C4380-6174-11d5-B4D4-0020AFEAE6C2),//E9B10FE0-08BE-11d5-B463-0020AFEAE6C2
        dual,
        helpstring("IFCStatistic3 Interface"),
        pointer_default(unique)
    ]
    interface IFCKernel3 : IUnknown
    {
        [id(1), helpstring("Íàäî âûçâàòü ïåðâûì")]
        HRESULT DoDispatch(
            [in] BSTR Config,
            [in] IUnknown *ArchiveIN,
            [in] IUnknown *ArchiveOUT/*,
            [in] IUnknown *Statistic,
            [in] IUnknown *Trace*/);

        [id(2), helpstring("Âîçîáíîâëÿåò ðàáîòó âñåõ ïðåîñòàíîâëåííûõ Dir-ñêàííåðîâ")] HRESULT ActivateDirScanners();
        [id(3), helpstring("Ïðåîñòàíàâëèâàåò ðàáîòó âñåõ Dir-ñêàííåðîâ")] HRESULT SuspendDirScanners();
        [id(4), helpstring("Çàâåðøàåò ðàáîòó âñåõ Dir-ñêàííåðîâ")] HRESULT StopDirScanners();

        [id(5), helpstring("Âîçîáíîâëÿåò ðàáîòó ïîñëå âñåõ ïðåîñòàíîâëåííûõ Queue-ñêàííåðîâ")] HRESULT ActivateQueueScanners();
        [id(6), helpstring("Ïðåîñòàíàâëèâàåò ðàáîòó âñåõ Queue-ñêàííåðîâ")] HRESULT SuspendQueueScanners();
        [id(7), helpstring("Çàâåðøàåò ðàáîòó âñåõ Queue-ñêàííåðîâ")] HRESULT StopQueueScanners();

        [id(8), helpstring("Çàâåðøàåò ðàáîòó ïîòîêà àíàëèçà ñïèñêà êâèòàíöèé")] HRESULT StopReceiptsAnalys();
        [id(9), helpstring("Ïðîâåðÿåò çàïóùåííîñòü")] HRESULT IsRun([out, retval] BOOL *pVal);

        [id(10), helpstring("Ïðîâåðÿåò àêòèâíîñòü Dir-ñêàííåðîâ")] HRESULT IsDirScannersActive([out, retval] BOOL *pVal);
        [id(11), helpstring("Ïðîâåðÿåò àêòèâíîñòü Queue-ñêàííåðîâ")] HRESULT IsQueueScannersActive([out, retval] BOOL *pVal);

        [id(12), helpstring("method SendFile")]
        HRESULT SendFile(
            [in] BSTR Config,
            [in] IUnknown *ArchiveOUT,
            [in] IUnknown *Statistic,
            [in] IUnknown *Trace,
            [in] IUnknown *Protocol,
            [in] BSTR bsRealPath,
            [in] BSTR bsPath,
            [in] BSTR bsFileName);

        [id(13), helpstring("method ReceiveFile")]
        HRESULT ReceiveFile(
            [in] BSTR Config,
            [in] IUnknown *ArchiveIN,
            [in] IUnknown *Statistic,
            [in] IUnknown *Trace,
            [in] IUnknown *Protocol,
            [in] BSTR bsQueue,
            [in] BSTR bsPath,
            [in] BSTR bsFileName,
            [out] BSTR* pbsFileMsgId);
        
        [id(14), helpstring("method EnumFiles")]
        HRESULT EnumFiles(
            [in] BSTR Config,
            [in] BSTR bsQueue,
            [out] DWORD *pnCount,
            [out, size_is(,*pnCount)] BSTR **ppbsFileNames,
            [out, size_is(,*pnCount)] DWORD **pFileLengthArray);

        [id(15), helpstring("method GetThreadInfo")]
        HRESULT GetThreadInfo( [in] DWORD dwThreadID, [out] long * pnStatus);

        [id(16), helpstring("method GetThreadList")]
        HRESULT GetThreadList( [out, size_is(,*pnCount)] struct_ThreadInfo ** ppThreadList, [out] long * pnCount);

        [id(17), helpstring("method OkunaMatata")]
        HRESULT OkunaMatata( [out, retval] BOOL * pbActive);

        [id(18), helpstring("method GetReceiptInfo")] 
        HRESULT GetReceiptInfo(
            [in] DWORD dwType, 
            [out] DWORD * pnReceiptCount, 
            [out, size_is(,*pnReceiptCount)] struct_ReceiptInfo ** ppReceiptInfo );

        [id(19), helpstring("method GetThreadDescribtion")] HRESULT GetThreadDescribtion([in] DWORD dwThreadID, [out] BSTR *pStr);
        [id(20), helpstring("method SetQMgrName")] HRESULT SetQMgrName([in] BSTR sQMgrName);
        
        [id(21), helpstring("method SetNotifier")] HRESULT SetNotifier([in] IUnknown *pNotifier);
        [id(22), helpstring("method DropNotifier")] HRESULT DropNotifier();
        [id(23), helpstring("method StartTrace")] HRESULT StartTrace();
        [id(24), helpstring("method StopTrace")] HRESULT StopTrace();
        
        [id(25), helpstring("method GetFCStatistic")] HRESULT GetFCStatistic([out] IFCStatistic3 **ppFCStat);        
        [id(26), helpstring("method GetFCArchive")] HRESULT GetFCArchive([out] IUnknown **ppSent, [out] IUnknown **ppRecv);        
        [id(27), helpstring("method DeleteFile")] HRESULT  DeleteFile([in] BSTR bsMsgId, [in] BSTR bsQueue);
        [id(28), helpstring("method Stop")]    HRESULT  Stop();
    };
    [
        object,
        uuid(37b2ebb0-b845-11d7-9981-0080ad174992),//(81b78040-48ae-11d7-a264-0080ad174992),//(CF61DC90-ED4F-11D4-B5C7-0020AF2320FA),
        dual,
        helpstring("IFCStatistic3 Interface"),
        pointer_default(unique)
    ]
    interface IFCStatistic3 : IUnknown
    {
        [id(1), helpstring("method Open")] HRESULT Open([in] BSTR Path);
        [id(2), helpstring("method AddOutBytes")] HRESULT AddOutBytes([in] BSTR bsQMgrName, [in] long Value);
        [id(3), helpstring("method AddInConfirms")] HRESULT AddInConfirms([in] BSTR bsQMgrName);
        [id(4), helpstring("method AddInBytes")] HRESULT AddInBytes([in] BSTR bsQMgrName, [in] long Value);
        [id(5), helpstring("method AddOutConfirms")] HRESULT AddOutConfirms([in] BSTR bsQMgrName);
        [id(6), helpstring("method AddInErrors")] HRESULT AddInErrors([in] BSTR bsQMgrName);
        [id(7), helpstring("method AddOutErrors")] HRESULT AddOutErrors([in] BSTR bsQMgrName);
        [id(8), helpstring("method GetInfo")] 
        HRESULT GetInfo(
            [out] DWORD * pnCount, 
            [out, size_is(,*pnCount)] struct_Statistic ** ppStatisticInfo );
    };
[
    uuid(EC2BD1E2-9E79-11D3-B751-0020AF2320FA),
    version(1.0),
    helpstring("ReceiveSendModule 1.0 Type Library")
]
library RECEIVESENDMODULELib
{
    // defines äëÿ ðàñøèðåííîãî ìîíèòîðèíãà ñîñòîÿíèÿ ïîòîêîâ
    typedef [public] [v1_enum] enum 
    {
        THREAD_STOP_STATUS        = 0, // ïîòîê íå çàïóùåí
        THREAD_RUNNING_STATUS    = 1, // ïîòîê ðàáîòàåò
        THREAD_DEAD_STATUS        = 2, // ïîòîê îñòàíîâëåí âñëåäñòâèå êðèòè÷åñêîé îøèáêè
        THREAD_SUSPEND_STATUS    = 3, // ïîòîê â ïðèîñòàíîâëåííîì ñîñòîÿíèè ( suspend )
    } THREAD_STATUS;

    // ÿñåí ïåðåö äëÿ ÷åãî...
    typedef [public] [v1_enum] enum 
    {
        SEND_TYPE        = 0, 
        RECEIVE_TYPE    = 1, 
        UN_RECEIVE_TYPE = 2
    } SCANNER_TYPES;

    importlib("stdole32.tlb");
    importlib("stdole2.tlb");

    [
        uuid(55c55e50-b845-11d7-9981-0080ad174992),//(73a40a30-4889-11d7-a264-0080ad174992),//(EC2BD1F2-9E79-11D3-B751-0020AF2320FA),
        helpstring("FCKernel3 Class")
    ]
    coclass FCKernel3
    {
        [default] interface IFCKernel3;
    };
    [
        uuid(6d6ea990-b845-11d7-9981-0080ad174992),//(1db76220-4889-11d7-a264-0080ad174992),//(46B66E57-AC73-11D3-B752-0020AF2320FA),
        helpstring("FCStatistic2 Class")
    ]
    coclass FCStatistic3
    {
        [default] interface IFCStatistic3;
    };
};
Re[5]: DISP_E_BADVARTYPE
От: Vi2 Удмуртия http://www.adem.ru
Дата: 21.05.04 11:28
Оценка: 14 (2)
Здравствуйте, gfn, Вы писали:

gfn>    interface IFCStatistic3;
gfn>    [
gfn>        object,
gfn>        dual,
gfn>...
gfn>    ]
gfn>    interface IFCKernel3 : IUnknown
gfn>    ...
gfn>    [
gfn>        object,
gfn>        dual,
gfn>...
gfn>    ]
gfn>    interface IFCStatistic3 : IUnknown
gfn>    {
gfn>...

У меня в такой ситуации VB просто вылетает и все дела. Ты уж реши или dual, или не dual. И если dual, то никаких size_is!
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[5]: DISP_E_BADVARTYPE
От: Tom Россия http://www.RSDN.ru
Дата: 21.05.04 11:38
Оценка:
В IDL всё нормально.
Вообще значение похоже на ошибку при вызове внутри твоего метода...
Протрасируй, вызов хоть приходит внутрь...
Народная мудрось
всем все никому ничего(с).
Re[6]: DISP_E_BADVARTYPE
От: gfn Россия  
Дата: 21.05.04 12:24
Оценка:
Здравствуйте, Tom, Вы писали:

Tom>В IDL всё нормально.

Tom>Вообще значение похоже на ошибку при вызове внутри твоего метода...
Tom>Протрасируй, вызов хоть приходит внутрь...

В том то и беда, что у меня все замечательно входит и выходит, как говорил Винни-Пух

А у заказчика до вызова метода интерфейса дело не доходит — рабочий поток его размаршалить не может.
Re[7]: DISP_E_BADVARTYPE
От: Tom Россия http://www.RSDN.ru
Дата: 21.05.04 12:30
Оценка: 2 (1)
gfn>В том то и беда, что у меня все замечательно входит и выходит, как говорил Винни-Пух
gfn>А у заказчика до вызова метода интерфейса дело не доходит — рабочий поток его размаршалить не может.

Ну значит с праксёй проблемма.
Скорее всего у тебя так как у интерфейсов стоит атрибут dual, то зарегистрирована прокся от oleautomation маршалера. А твоя скомпилированная не регистрируется. По этому ессно размаршалить этот интерфейс oleautomation пракся не может. Убери dual как говорил Vi2...
Народная мудрось
всем все никому ничего(с).
Re[8]: DISP_E_BADVARTYPE
От: gfn Россия  
Дата: 24.05.04 05:20
Оценка:
Здравствуйте, Tom, Вы писали:

Tom>Ну значит с праксёй проблемма.

Tom>Скорее всего у тебя так как у интерфейсов стоит атрибут dual, то зарегистрирована прокся от oleautomation маршалера. А твоя скомпилированная не регистрируется. По этому ессно размаршалить этот интерфейс oleautomation пракся не может. Убери dual как говорил Vi2...

Спасибо большое, действительно, похоже так все и было. Обманул меня клиент, сказал, что все зарегистрировал правильно.
Re[9]: Проблема своих проксей/стабов
От: Vi2 Удмуртия http://www.adem.ru
Дата: 24.05.04 06:29
Оценка:
Здравствуйте, gfn, Вы писали:

gfn>...Обманул меня клиент, сказал, что все зарегистрировал правильно.

В этом проблема своих проксей/стабов. Их нужно регистрировать — обязательно, отдельно и после основного сервера (и, по уму, дерегистрировать перед). Неплохо справляется с этим специальный код регистрации/дерегистрации сервера, который и выполнял бы эту необходимую процедуру при запуске с ключами -RegServer и -UnregServer. Но это же писать надо...
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.