Re[8]: VBA падает
От: AiratSA Россия  
Дата: 26.07.02 14:32
Оценка: 8 (1)
Здравствуйте Vi2, Вы писали:

ASA>>Нашел ошибку. Она была в get_CurrentColName, но почему не проявлялась в ActiveX Control Test Container не понятно.


Vi2>Вот показал бы, что было неправильно, чтобы другие читатели об это не споткнулись, и оценку бы получил за решение проблемы.


Vi2>А мне оценку ставить было не за что, да и не за оценки же помогаем, а для развитие своего брата-программиста. Хотя и приятно.


Текст должен быть таким

STDMETHODIMP CSliChart::get_CurrentColName(BSTR *pVal)
{
  // TODO: Add your implementation code here
  USES_CONVERSION;
  char* s = fCurrentColName ? fCurrentColName : "";
  *pVal = ::SysAllocString(A2OLE(s));
  return S_OK;
}


Я привык работать с классами для представления строк и забыл, что BSTR — всего лишь указатель на OLECHAR и у меня было написано

...
  *pVal = s;
...

В момент показа окна свойств VBA запрашивал свойство CurrentColName, т.е. происходил вызов get_CurrentColName и это приводило к падению.

А теперь почему не падало, если свойство CurrentColName было только на чтение (т.е. было propget, но не было propput). Свойства "только на чтение" или "только на запись" не показываются в окне свойств, следовательно, не происходил вызов get_CurrentColName. Если бы я вызвал данное свойство из кода на Visual Basic, то сбой произошел бы.

Внимательнее надо быть.
Re[5]: VBA падает
От: Vi2 Удмуртия http://www.adem.ru
Дата: 26.07.02 08:42
Оценка: 3 (1)
Здравствуйте AiratSA, Вы писали:

Постить нужно только всю необхоимую (а не просто всю) информацию. Вот примерно так (это не наезд, а просто совет):

Добавить как определена diCurrentColName
ASA>    [
ASA>        object,
ASA>        uuid(4832D8A3-BB72-4268-AF0D-10BEFECB7953),
ASA>        dual,
ASA>        helpstring("ISliChart Interface"),
ASA>        pointer_default(unique)
ASA>    ]
ASA>    interface ISliChart : IDispatch
ASA>    {

ASA>        ...
ASA>        [propget, id(diCurrentColName), helpstring("property CurrentColName")] HRESULT CurrentColName([out, retval] BSTR *pVal);
ASA>        [propput, id(diCurrentColName), helpstring("property CurrentColName")] HRESULT CurrentColName([in] BSTR newVal);
ASA>        ...
ASA>};

ASA>[
ASA>    uuid(5805881D-1F38-436C-B5F6-5CABE0738409),
ASA>    version(1.0),
ASA>    helpstring("ChrtLive 1.0 Type Library")
ASA>]
ASA>library CHRTLIVELib
ASA>{
ASA>    ...
ASA>    [
ASA>        uuid(9712C4D7-7AEB-470F-90F1-2CE9545DC5F6),
ASA>        helpstring("_ISliChartEvents Interface")
ASA>    ]
ASA>    dispinterface _ISliChartEvents
ASA>    {
ASA>        ...
ASA>    };
ASA>    [
ASA>        uuid(AD62EF66-7F3B-45EB-8003-72C2B409D262),
ASA>        helpstring("ChartLive Class")
ASA>    ]
ASA>    coclass SliChart
ASA>    {
ASA>        [default] interface ISliChart;
ASA>        [default, source] dispinterface _ISliChartEvents;
ASA>    };
ASA>};


Похоже idl у тебя нормальный, если diCurrentColName константа определена и OLEView показывает корректный текст твоей TLB. Проверь, кстати, OLEView-ером.

Поэтому всё же проблема в реализации методов.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
VBA падает
От: AiratSA Россия  
Дата: 26.07.02 07:52
Оценка:
Написал ActiveX на ATL, все вроде работает.
Стоит ввести свойство

[propput, id(diCurrentColName), helpstring("property CurrentColName")] HRESULT CurrentColName([in] BSTR newVal);


как приложения, работающие через VBA (в том числе Word и Excel) падают при попытке отображения свойств моего объекта в окне "Properties window". Причем свойство

[propget, id(diCurrentColName), helpstring("property CurrentColName")] HRESULT CurrentColName([out, retval] BSTR *pVal);


проблем не вызывает.

В чем, дело, подскажите, замучился совсем
Re: VBA падает
От: Vi2 Удмуртия http://www.adem.ru
Дата: 26.07.02 08:09
Оценка:
Здравствуйте AiratSA, Вы писали:

ASA>[propput, id(diCurrentColName), helpstring("property CurrentColName")] HRESULT CurrentColName([in] BSTR newVal);


Покажи код Put_CurrentColName и как работаешь с принимаемой строкой. И что за ошибка.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[2]: VBA падает
От: AiratSA Россия  
Дата: 26.07.02 08:16
Оценка:
Vi2>
ASA>>[propput, id(diCurrentColName), helpstring("property CurrentColName")] HRESULT CurrentColName([in] BSTR newVal);
Vi2>


Vi2>Покажи код Put_CurrentColName и как работаешь с принимаемой строкой. И что за ошибка.


Код корректный. Из ActiveX Control Test Container все прекрасно работает. К тому же дело до вызова не доходит.Падает в тот момент, VBA пытается отобразить свойства в своем окне, Оно обычно находится в левом нижнем углу экрана. Такое впечатление, что VBA не нравится то, что находится в библиотеке типов, но что именно — не пойму.
Re[3]: VBA падает
От: Vi2 Удмуртия http://www.adem.ru
Дата: 26.07.02 08:19
Оценка:
Здравствуйте AiratSA, Вы писали:

Vi2>>Покажи код Put_CurrentColName и как работаешь с принимаемой строкой. И что за ошибка.


ASA>Код корректный. Из ActiveX Control Test Container все прекрасно работает. К тому же дело до вызова не доходит.Падает в тот момент, VBA пытается отобразить свойства в своем окне, Оно обычно находится в левом нижнем углу экрана. Такое впечатление, что VBA не нравится то, что находится в библиотеке типов, но что именно — не пойму.


Ну тогда давай IDL файл с твоим объектом и интерфейсом.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[4]: VBA падает
От: AiratSA Россия  
Дата: 26.07.02 08:24
Оценка:
Vi2>Ну тогда давай IDL файл с твоим объектом и интерфейсом.


    [
        object,
        uuid(4832D8A3-BB72-4268-AF0D-10BEFECB7953),
        dual,
        helpstring("ISliChart Interface"),
        pointer_default(unique)
    ]
    interface ISliChart : IDispatch
    {

        [propget, id(diDoubleBuffer), helpstring("property DoubleBuffer")] HRESULT DoubleBuffer([out, retval] VARIANT_BOOL *pVal);
        [propput, id(diDoubleBuffer), helpstring("property DoubleBuffer")] HRESULT DoubleBuffer([in] VARIANT_BOOL newVal);

        [propget, id(diHasStatus), helpstring("property HasStatus")] HRESULT HasStatus([out, retval] VARIANT_BOOL *pVal);
        [propput, id(diHasStatus), helpstring("property HasStatus")] HRESULT HasStatus([in] VARIANT_BOOL newVal);
    [propget, id(diInteractive), helpstring("property Interactive")] HRESULT Interactive([out, retval] VARIANT_BOOL *pVal);
    [propput, id(diInteractive), helpstring("property Interactive")] HRESULT Interactive([in] VARIANT_BOOL newVal);
        [propget, id(diSelectOutside), helpstring("property SelectOutside")] HRESULT SelectOutside([out, retval] VARIANT_BOOL *pVal);
        [propput, id(diSelectOutside), helpstring("property SelectOutside")] HRESULT SelectOutside([in] VARIANT_BOOL newVal);
        [propget, id(diSelectMode), helpstring("property SelectMode")] HRESULT SelectMode([out, retval] long *pVal);
        [propput, id(diSelectMode), helpstring("property SelectMode")] HRESULT SelectMode([in] long newVal);
        [propget, id(diSelectShape), helpstring("property SelectShape")] HRESULT SelectShape([out, retval] long *pVal);
        [propput, id(diSelectShape), helpstring("property SelectShape")] HRESULT SelectShape([in] long newVal);
        [propget, id(diSlideNo), helpstring("property SlideNo")] HRESULT SlideNo([out, retval] long *pVal);
        [propget, id(diChartLibError), helpstring("property ChartLibError")] HRESULT ChartLibError([out, retval] long *pVal);
        [propget, id(diCurrentColName), helpstring("property CurrentColName")] HRESULT CurrentColName([out, retval] BSTR *pVal);
        [propput, id(diCurrentColName), helpstring("property CurrentColName")] HRESULT CurrentColName([in] BSTR newVal);
        [propget, id(diValue), helpstring("property Value")] HRESULT Value([in] long row, [out, retval] VARIANT *pVal);
        [propput, id(diValue), helpstring("property Value")] HRESULT Value([in] long row, [in] VARIANT newVal);

        [id(20), helpstring("method DataFile")] HRESULT DataFile([in] BSTR fileName);
        [id(21), helpstring("method DataLine")] HRESULT DataLine([in] BSTR line);
        [id(22), helpstring("method DataVector")] HRESULT DataVector([in] VARIANT v);
        [id(23), helpstring("method SlideMaxZoom")] HRESULT SlideMaxZoom();
        [id(24), helpstring("method SlideRefresh")] HRESULT SlideRefresh();
        [id(25), helpstring("method SlideDraw")] HRESULT SlideDraw();
        [id(26), helpstring("method ChartScreenToReal")] HRESULT ChartScreenToReal([in] long x, [in] long y, [out] double* rx, [out] double* ry, [out] double* rz);
        [id(27), helpstring("method ChartRealToScreen")] HRESULT ChartRealToScreen([in] double rx, [in] double ry, [out] long* x, [out] long* y);
        [id(28), helpstring("method ChartGetZoom")] HRESULT ChartGetZoom([out] double*  x1, [out] double* y1, [out] double* x2, [out] double* y2);
        [id(29), helpstring("method ChartGetMaxZoom")] HRESULT ChartGetMaxZoom([out] double*  x1, [out] double* y1, [out] double* x2, [out] double* y2);
        [id(30), helpstring("method ChartSetZoom")] HRESULT ChartSetZoom([in] double x1, [in] double y1, [in] double x2, [in] double y2);
        [id(31), helpstring("method ChartSelectPoint")] HRESULT ChartSelectPoint([in] long series, [in] long point);
        [id(32), helpstring("method ChartSelectAll")] HRESULT ChartSelectAll();
        [id(33), helpstring("method ChartSetActivePoint")] HRESULT ChartSetActivePoint([in] long series, [in] long point, [in] ClActivateDir dir);
    [id(34), helpstring("method ChartGetActivePoint")] HRESULT ChartGetActivePoint([in, out] IDispatch** info, [out, retval] long* err);
        [id(35), helpstring("method ChartGetPointInfo")] HRESULT ChartGetPointInfo([in, out] IDispatch** info, [out, retval] long* err);
        [id(36), helpstring("method ChartGetTableLine")] HRESULT ChartGetTableLine([in, out] IDispatch** info, [out, retval] VARIANT_BOOL* result);
        [id(37), helpstring("method ChartGetXYInfo")] HRESULT ChartGetXYInfo([in] long x, [in] long y, [in] BSTR series, [in] BSTR expr, [out, retval] BSTR* buf);
        [id(38), helpstring("method SaveAsEMF")] HRESULT SaveAsEMF([in] BSTR fileName);
        [id(39), helpstring("method SaveAsBMP")] HRESULT SaveAsBMP([in] BSTR fileName);
        [id(40), helpstring("method CopyToClipboard")] HRESULT CopyToClipboard();
/*
*/
};
        

[
    uuid(5805881D-1F38-436C-B5F6-5CABE0738409),
    version(1.0),
    helpstring("ChrtLive 1.0 Type Library")
]
library CHRTLIVELib
{
    importlib("stdole32.tlb");
    importlib("stdole2.tlb");

    [
        uuid(9712C4D7-7AEB-470F-90F1-2CE9545DC5F6),
        helpstring("_ISliChartEvents Interface")
    ]
    dispinterface _ISliChartEvents
    {
        properties:
        methods:
        [id(1), helpstring("method OnStatusChange")] HRESULT OnStatusChange([in] BSTR text);
        [id(2), helpstring("method OnDataChange")] HRESULT OnDataChange(BSTR area);
        [id(3), helpstring("method OnSlideChange")] HRESULT OnSlideChange([in] long prevSlide, [in] long curSlide, [in] BSTR fileName);
        [id(4), helpstring("method OnPointActivate")] HRESULT OnPointActivate([in] long series, [in] long point);
    [id(5), helpstring("method OnPointSelect")] HRESULT OnPointSelect([in] long series, [in] long point, [in] VARIANT_BOOL selected);
    [id(6), helpstring("method OnPointHighlight")] HRESULT OnPointHighlight([in] long series, [in] long point);
        [id(7), helpstring("method OnSceneChange")] HRESULT OnSceneChange(BSTR area);
        [id(8), helpstring("method OnDataFile")] HRESULT OnDataFile([in] BSTR fileName);
        [id(9), helpstring("method OnPaintStart")] HRESULT OnPaintStart();
        [id(10), helpstring("method OnPaintFinish")] HRESULT OnPaintFinish();
    };
    [
        object,
        uuid(60039FF6-4038-433C-86F1-40D9030FF48D),
        dual,
        helpstring("IPointInfo Interface"),
        pointer_default(unique)
    ]
    interface IPointInfo : IDispatch
    {
        [propget, id(1), helpstring("property PanelName")] HRESULT PanelName([out, retval] BSTR *pVal);
        [propget, id(2), helpstring("property SeriesName")] HRESULT SeriesName([out, retval] BSTR *pVal);
        [propget, id(5), helpstring("property X")] HRESULT X([out, retval] double *pVal);
        [propget, id(6), helpstring("property Y")] HRESULT Y([out, retval] double *pVal);
        [propget, id(7), helpstring("property Z")] HRESULT Z([out, retval] double *pVal);
        [propget, id(8), helpstring("property Text")] HRESULT Text([out, retval] BSTR *pVal);
        [propget, id(9), helpstring("property Selected")] HRESULT Selected([out, retval] VARIANT_BOOL *pVal);
        [propget, id(10), helpstring("property Selectable")] HRESULT Selectable([out, retval] VARIANT_BOOL *pVal);
        [propget, id(11), helpstring("property Series")] HRESULT Series([out, retval] long *pVal);
        [propput, id(11), helpstring("property Series")] HRESULT Series([in] long newVal);
        [propget, id(12), helpstring("property Point")] HRESULT Point([out, retval] long *pVal);
        [propput, id(12), helpstring("property Point")] HRESULT Point([in] long newVal);
    };

    [
        uuid(AD62EF66-7F3B-45EB-8003-72C2B409D262),
        helpstring("ChartLive Class")
    ]
    coclass SliChart
    {
        [default] interface ISliChart;
        [default, source] dispinterface _ISliChartEvents;
    };
    [
        uuid(FF73A48F-7590-4EEA-A067-6BAEFE64A543),
        helpstring("PointInfo Class")
    ]
    coclass PointInfo
    {
        [default] interface IPointInfo;
    };
};
Re[6]: VBA падает
От: AiratSA Россия  
Дата: 26.07.02 10:22
Оценка:
Здравствуйте Vi2, Вы писали:


Vi2>Похоже idl у тебя нормальный, если diCurrentColName константа определена и OLEView показывает корректный текст твоей TLB. Проверь, кстати, OLEView-ером.


Vi2>Поэтому всё же проблема в реализации методов.


Нашел ошибку. Она была в get_CurrentColName, но почему не проявлялась в ActiveX Control Test Container не понятно.
К сожалению, больше тройки поставить нельзя.
Re[7]: VBA падает
От: Vi2 Удмуртия http://www.adem.ru
Дата: 26.07.02 10:32
Оценка:
Здравствуйте AiratSA, Вы писали:

ASA>Нашел ошибку. Она была в get_CurrentColName, но почему не проявлялась в ActiveX Control Test Container не понятно.


Вот показал бы, что было неправильно, чтобы другие читатели об это не споткнулись, и оценку бы получил за решение проблемы.

А мне оценку ставить было не за что, да и не за оценки же помогаем, а для развитие своего брата-программиста. Хотя и приятно.
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
Re[9]: VBA падает
От: Vi2 Удмуртия http://www.adem.ru
Дата: 26.07.02 15:09
Оценка:
Здравствуйте AiratSA, Вы писали:

ASA>Нашел ошибку. Она была в get_CurrentColName, но почему не проявлялась в ActiveX Control Test Container не понятно.


ASA>В момент показа окна свойств VBA запрашивал свойство CurrentColName, т.е. происходил вызов get_CurrentColName и это приводило к падению.


А может там (в ActiveX Control Test Container) и нет такого чуда как в VB — окно свойств. Может ты не обращался именно к этому свойству, поэтому и не падало.

ASA>Текст должен быть таким


ASA>STDMETHODIMP CSliChart::get_CurrentColName(BSTR *pVal)
ASA>{
ASA>  // TODO: Add your implementation code here
ASA>  USES_CONVERSION;
ASA>  char* s = fCurrentColName ? fCurrentColName : "";
ASA>  *pVal = ::SysAllocString(A2OLE(s));
ASA>  return S_OK;
ASA>}


ASA>Я привык работать с классами для представления строк и забыл, что BSTR — всего лишь указатель на OLECHAR и у меня было написано


Если ты привык работать с классами, то этот пример тебя заинтересует

STDMETHODIMP CSliChart::get_CurrentColName(BSTR *pVal)
{
  if( pVal )
    return E_POINTER:
  char* s = fCurrentColName ? fCurrentColName : "";
  *pVal = CComBSTR( s ).Detach();
или просто
  *pVal = CComBSTR( fCurrentColName ? fCurrentColName : "" ).Detach();
}
Vita
Выше головы не прыгнешь, ниже земли не упадешь, дальше границы не убежишь! © КВН НГУ
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.