Поиск:

Ответ в темуСоздание новой темы Создание опроса
> COM-компонент возвращает клиенту нулевые указатели 
:(
    Опции темы
yaprogrammer
Дата 7.10.2009, 13:00 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 6.8.2009

Репутация: нет
Всего: нет



При первом запуске клиента все проходит нормально. При Debugе клиента все проходит нормально. При втором и последующих запусках возращает нулевой указатель.  Сервер всегда пишет в лог правильные данные.
Код клиента 
Код

DWORD dwCount = 5;
DWORD* pphServer;
HRESULT* ppErrors;

HRESULT hr = pServer->GetItems(dwCount, &pphServer, &ppErrors);
if(SUCCEEDED(hr))
{
       for(DWORD ii = 0; ii < dwCount; ii++)
      {
           cout << ii << ") " << pphServer[ii] << "\n";            
      }
}
CoTaskMemFree(ppErrors);
CoTaskMemFree(pphServer);


Код компонента
Код

HRESULT CServer::GetItems(
    DWORD        dwCount,    
    DWORD** pphServer,
    HRESULT**   ppErrors
)
{       
    if (dwCount == 0 || ppErrors == NULL)
    {        
        return E_INVALIDARG;
    }
    
    *pphServer = GetServerItems(dwCount); //здесь выделяется память и записываются данные
    
    *ppErrors = (HRESULT*)CoTaskMemAlloc(sizeof(HRESULT) * dwCount);

    bool bError = false;

    for (DWORD ii = 0; ii < dwCount; ii++)
    {
        if ((*pphServer)[ii] == NULL)
        {
            (*ppErrors)[ii] = S_FALSE;
            bError = true;
        }
        else
               {
                        GetLogFile().Print((*pphServer)[ii]); // вывожу в лог
                        (*ppErrors)[ii] = S_OK;
                }
    }
    
    return (bError)?S_FALSE:S_OK;
}





PM MAIL   Вверх
jonie
Дата 7.10.2009, 15:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 5
Всего: 118



yaprogrammer, ну и ? Отладчик запретили что ли? Отлаживайте компонент - кто вам мешает ? Наставьте assert-ов наконец...


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Andrey44
Дата 8.10.2009, 07:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 2
Всего: 26



Цитата(yaprogrammer @  7.10.2009,  13:00 Найти цитируемый пост)
При втором и последующих запусках возращает нулевой указатель. 

значит надо смотреть *pphServer = GetServerItems(dwCount); //здесь выделяется память и записываются данные
Почему GetServerItems возвращает пустой указатель.



--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
yaprogrammer
Дата 8.10.2009, 09:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 6.8.2009

Репутация: нет
Всего: нет



А подскажите пожалуйста как отлаживать компонент в msvc 6.0?
PM MAIL   Вверх
jonie
Дата 8.10.2009, 11:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 5
Всего: 118



yaprogrammer, абсолютно также как и в VS2010. Стартуете отладчик, только запускаемым exe-шником (студия спросит вас) указываете нечто, что ипользует ваш компонент (да хоть IE например). И всё.


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
yaprogrammer
Дата 9.10.2009, 10:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 6.8.2009

Репутация: нет
Всего: нет



jonie Я так понимаю, что это работает для компонента в dll. А у меня компонент реализован в exe.

Andrey44 Вставил проверку на пустой указатель - память выделяется нормально.

Уже начал грешить на код IDL:
Код

Interface IX
[
    object,
    uuid(32BB8326-B41B-11CF-A6BB-0080C7B2D682),
    helpstring("IX Interface"),
    pointer_default(unique),
    dual,
    oleautomation
]
interface IX : IDispatch
{
    import "oaidl.idl" ;

    HRESULT GetItems(
    [in]                                               DWORD        dwCount,    
    [out, size_is(,dwCount)]                DWORD** pphServer,
    [out, size_is(,dwCount)]                HRESULT**   ppErrors
    );
    
} ;

//
// Component and type library descriptions
//
[
    uuid(9992140f-b6d6-4584-b765-ef2aa1aca2ab),
    version(1.0),
    helpstring("My Type Library")
]
library ServerLib
{
    importlib("stdole32.tlb") ;

    // Component
    [
        uuid(298fe0b3-6242-46cc-8a39-372bcdc7f68f),
        helpstring("Component Class")
    ]
    coclass Component
    {
        [default] interface IX ;        
    } ;
} ;





И является ли правильным выделение памяти с помощью CoTaskMemAlloc когда компонент и клиент в разных процессах?

PM MAIL   Вверх
Andrey44
Дата 9.10.2009, 10:42 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 2
Всего: 26



Цитата(yaprogrammer @  7.10.2009,  13:00 Найти цитируемый пост)
При втором и последующих запусках возращает нулевой указатель.
Нулевой указатель чего?

Цитата(yaprogrammer @  9.10.2009,  10:02 Найти цитируемый пост)
И является ли правильным выделение памяти с помощью CoTaskMemAlloc когда компонент и клиент в разных процессах
Да, правильно



--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
yaprogrammer
Дата 9.10.2009, 10:46 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 6.8.2009

Репутация: нет
Всего: нет



Нулевой указатель pphServer и ppErrors.
PM MAIL   Вверх
Andrey44
Дата 9.10.2009, 10:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 2
Всего: 26



Цитата(yaprogrammer @  9.10.2009,  10:02 Найти цитируемый пост)
Вставил проверку на пустой указатель - память выделяется нормально.

Что-то я вас не пойму.
Покажите как проверяете


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
yaprogrammer
Дата 9.10.2009, 10:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 6.8.2009

Репутация: нет
Всего: нет



После выделения памяти на сервере проверяю так
Код

if(*pphServer == NULL || *ppErrors == NULL)
{
      return E_OUTOFMEMORY;
}

PM MAIL   Вверх
Andrey44
Дата 9.10.2009, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1501
Регистрация: 4.12.2006
Где: На работе

Репутация: 2
Всего: 26



Так где-же возвращается нулевой указатель?
Сделайте так
Код

if(*pphServer == NULL)
{
      return E_OUTOFMEMORY;
}

 || *ppErrors == NULL я думаю проверять не надо, так как обычно ppErrors == NULL при успешном выполнении функции.
По этому вы постоянно и возвращаете из функции E_OUTOFMEMORY


--------------------
????? ??, ??????? ?????.  smile 
PM MAIL WWW ICQ   Вверх
xvr
Дата 9.10.2009, 12:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 8
Всего: 223



Судя по IDL у вас интерфейс IX dispinterface и dual, но типы параметров pphServer и ppErrors несовместимы с dispinterface  smile 
Какой код возврата (hr в клиенте в строке 6)?

PM MAIL   Вверх
yaprogrammer
Дата 9.10.2009, 13:20 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 11
Регистрация: 6.8.2009

Репутация: нет
Всего: нет



Cоздал новый компонент, указал другие uuid, сделал проверку на пустой указатель как говорил Andrey44. Теперь возвращает не пустые указатели. но значения не те, точнее только первое значение массива то:
На сервере записываю следующие значения: 10, 11, 12, 13, 14

А на клиенте считываю: 10, 0, 1296387404, 8, 1244932

При этом код возврата функции hr = 0.

Цитата

типы параметров pphServer и ppErrors несовместимы с dispinterface  

xvr, а какими они должны быть?


PM MAIL   Вверх
xvr
Дата 9.10.2009, 13:58 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Комодератор
Сообщений: 7046
Регистрация: 28.8.2007
Где: Дублин, Ирландия

Репутация: 8
Всего: 223



Цитата(yaprogrammer @ 9.10.2009,  13:20)
Cоздал новый компонент, указал другие uuid, сделал проверку на пустой указатель как говорил Andrey44. Теперь возвращает не пустые указатели. но значения не те, точнее только первое значение массива то:
На сервере записываю следующие значения: 10, 11, 12, 13, 14

А на клиенте считываю: 10, 0, 1296387404, 8, 1244932

При этом код возврата функции hr = 0.

Похоже size_is считается в байтах, а не в элементах (что логично). Попробуйте так
Код

    HRESULT GetItems(
    [in]                                               DWORD        dwCount,    
    [out, size_is(,dwCount*4)]                DWORD** pphServer,
    [out, size_is(,dwCount*4)]                HRESULT**   ppErrors
    );


Цитата

Цитата

типы параметров pphServer и ppErrors несовместимы с dispinterface  

xvr, а какими они должны быть?
SAFEARRAY
А вам точно нужен dispinterface? Может и обычного IUnknown хватит?

PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: COM/DCOM/ActiveX/ATL/CORBA | Следующая тема »


 




[ Время генерации скрипта: 0.0571 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.