Поиск:

Ответ в темуСоздание новой темы Создание опроса
> параметры в Invoke 
:(
    Опции темы
kline
Дата 27.10.2008, 12:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Делаю COM-сервер с дуальным интерфейсом, и в передаче параметров в IDispatch::Invoke
программа вылетает с ошибкой долступа к памяти
Код

HRESULT __stdcall IMyInterface::Invoke(DISPID dispidMember, const IID& iid, LCID, WORD wFlags,
                                     DISPPARAMS* pDispParams, VARIANT* pvarResult,
                                     EXCEPINFO* pExcepInfo, UINT* pArgErr)
{
    if(iid != IID_NULL)
    {
        return DISP_E_UNKNOWNINTERFACE;
    }

    if(dispidMember == (long)1024)
    {
        VARIANT outer;
        VARIANT www1;
        VARIANT www2;
        www1 = *pDispParams[0].rgvarg;
        www2 = *pDispParams[1].rgvarg;        
        outer = GetResNumber(www1, www2);
        pvarResult = &outer;
        return S_OK;
    }



подскажите где я натупил с указателями?

PM MAIL   Вверх
kline
Дата 28.10.2008, 09:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Дальше интересней
разобрался с указателями - ошибок исполнения нет но
параметры передаются как-то странно
Код

if(dispidMember == (long)1024)
{
    VARIANT outer;
    VARIANT www1;
    VARIANT www2;
        VariantInit(&www1);
        VariantInit(&www2);
    www1 = pDispParams->rgvarg[0];
    www2 = pDispParams->rgvarg[1];
//проверка параметра    
    char* test = new char[255];
    WideCharToMultiByte(CP_ACP, NULL, www1.bstrVal, -1, test, 20, NULL, NULL);    
    MessageBoxA(NULL, test, "test_super", NULL);
//конец проверки параметра
    outer = GetResNumber(www1, www2);
        delete test;
    pvarResult = &outer;
    return S_OK;

вызывается это дело так
Код

dim acc, in2
in2 = "Hello world"
acc = "By By World"
Set www = CreateObject("MyTestObject")
in2 = www.GetResNumber(acc, in2)
msgbox in2

при выполнении видим
user posted image
куда рыть??????

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


Эксперт
****


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

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



Цитата(kline @ 28.10.2008,  09:03)
Дальше интересней
разобрался с указателями - ошибок исполнения нет но
параметры передаются как-то странно
Код

if(dispidMember == (long)1024)
{
    VARIANT outer;
    VARIANT www1;
    VARIANT www2;
        VariantInit(&www1);
        VariantInit(&www2);
    www1 = pDispParams->rgvarg[0];
    www2 = pDispParams->rgvarg[1];
//проверка параметра    
    char* test = new char[255];
    WideCharToMultiByte(CP_ACP, NULL, www1.bstrVal, -1, test, 20, NULL, NULL);    
    MessageBoxA(NULL, test, "test_super", NULL);
//конец проверки параметра
    outer = GetResNumber(www1, www2);
        delete test;
    pvarResult = &outer;
    return S_OK;

вызывается это дело так
Код

dim acc, in2
in2 = "Hello world"
acc = "By By World"
Set www = CreateObject("MyTestObject")
in2 = www.GetResNumber(acc, in2)
msgbox in2

при выполнении видим
user posted image
куда рыть??????

Проверить типы www1 и www2 (возможно там не строки)
Во вторых исправить строку 17 на *pvarResult = outer; (да и pvarResult на NULL не плохо было бы проверить)

PM MAIL   Вверх
kline
Дата 28.10.2008, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



точно
поставил проверку
Код

        if(pDispParams->rgvarg[0].vt != VT_BSTR)
        {
            MessageBoxA(NULL, "Ни хрена не строка", "test_super", NULL);                
        }


а как определить какой тип в варианте?

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


Новичок



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

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



Спасибо xvr
разобрался, действительно VB пихает строку не VT_BSTR
применяя преобразование типа всё ставим на место
но правда не нашол в какой тип складывается строка,
предполагаю что в SAFEARRAY???
вот так пашет :
Код

        VARIANT outer, www1, www2;
                VariantInit(&www1);
            VariantInit(&www2);
        VariantChangeType(&www1, &pDispParams->rgvarg[0], 0, VT_BSTR);
        VariantChangeType(&www2, &pDispParams->rgvarg[1], 0, VT_BSTR);
        outer = GetResNumber(www2, www1);
        VariantChangeType(pvarResult, &outer, 0, VT_BSTR);
        return S_OK;


Добавлено через 1 минуту и 58 секунд
Sorry xvr
на +
постов не хватает smile 
PM MAIL   Вверх
xvr
Дата 30.10.2008, 11:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(kline @ 28.10.2008,  12:54)
точно
поставил проверку
Код

        if(pDispParams->rgvarg[0].vt != VT_BSTR)
        {
            MessageBoxA(NULL, "Ни хрена не строка", "test_super", NULL);                
        }


а как определить какой тип в варианте?

Распечатай pDispParams->rgvarg[0].vt  (можно через sprintf и тот же MessageBox) и посмотри какой VT_* константе он равен.

PM MAIL   Вверх
kline
Дата 30.10.2008, 12:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



это да, я сделал сразу
но выдаёт-то число а в хидерах соответствия нет smile 


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


Эксперт
****


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

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



Цитата(kline @ 30.10.2008,  12:54)
это да, я сделал сразу
но выдаёт-то число а в хидерах соответствия нет smile

Какое число? Соотвествие найдем  smile 
PM MAIL   Вверх
kline
Дата 1.11.2008, 08:45 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



Выдаёт 16396

проверял так
Код

    short rrr = pDispParams->rgvarg[1].vt;
    char* rrr1 = new char[20];
    sprintf(rrr1, "%d", rrr);
    MessageBoxA(NULL,rrr1,"test_vt",NULL);


PM MAIL   Вверх
kline
Дата 1.11.2008, 09:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



это при одиночном запуске

а сейчас запустил в цикле получаю 9
PM MAIL   Вверх
xvr
Дата 1.11.2008, 09:30 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(kline @ 1.11.2008,  08:45)
Выдаёт 16396

Это соотвествует Variant by ref (ссылка на вариант)

Цитата

а сейчас запустил в цикле получаю 9
А это соотвествует Dispatch (объект)

Т.е. в первом случае переменная была передана по ссылке, а что бы ее можно было изменить на что угодно, ее завернули в Variant
Во втором случае строка была преобразованна в объект (String) и переданна в таком виде.

PM MAIL   Вверх
kline
Дата 1.11.2008, 18:08 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



а где смотрел? smile 
PM MAIL   Вверх
xvr
Дата 1.11.2008, 22:18 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


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

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



Цитата(kline @ 1.11.2008,  18:08)
а где смотрел? smile

wtypes.idl
Код

enum VARENUM
{
    VT_EMPTY           = 0,
    VT_NULL            = 1,
    VT_I2              = 2,
    VT_I4              = 3,
    VT_R4              = 4,
    VT_R8              = 5,
    VT_CY              = 6,
    VT_DATE            = 7,
    VT_BSTR            = 8,
    VT_DISPATCH        = 9,
    VT_ERROR           = 10,
    VT_BOOL            = 11,
    VT_VARIANT         = 12,
    VT_UNKNOWN         = 13,
    VT_DECIMAL         = 14,
// VBA reserves 15 for future use
    VT_I1              = 16,
    VT_UI1             = 17,
    VT_UI2             = 18,
    VT_UI4             = 19,
    VT_I8              = 20,
    VT_UI8             = 21,
    VT_INT             = 22,
    VT_UINT            = 23,
    VT_VOID            = 24,
    VT_HRESULT         = 25,
    VT_PTR             = 26,
    VT_SAFEARRAY       = 27,
    VT_CARRAY          = 28,
    VT_USERDEFINED     = 29,
    VT_LPSTR           = 30,
    VT_LPWSTR          = 31,
// VBA reserves 32-35 for future use
    VT_RECORD          = 36,
    VT_INT_PTR         = 37,
    VT_UINT_PTR        = 38,    

    VT_FILETIME        = 64,
    VT_BLOB            = 65,
    VT_STREAM          = 66,
    VT_STORAGE         = 67,
    VT_STREAMED_OBJECT = 68,
    VT_STORED_OBJECT   = 69,
    VT_BLOB_OBJECT     = 70,
    VT_CF              = 71,
    VT_CLSID           = 72,
    VT_VERSIONED_STREAM= 73,

    VT_BSTR_BLOB       = 0x0fff,

    VT_VECTOR          = 0x1000,
    VT_ARRAY           = 0x2000,
    VT_BYREF           = 0x4000,
    VT_RESERVED        = 0x8000,

    VT_ILLEGAL         = 0xffff,
    VT_ILLEGALMASKED   = 0x0fff,
    VT_TYPEMASK        = 0x0fff
};
16396 = 0x400C (VT_BYREF|VT_VARIANT)


Это сообщение отредактировал(а) xvr - 1.11.2008, 22:18
PM MAIL   Вверх
kline
Дата 6.11.2008, 15:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



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

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



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


 




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


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

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