Здравствуйте 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, то сбой произошел бы.
Внимательнее надо быть.
Здравствуйте 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-ером.
Поэтому всё же проблема в реализации методов.
Написал 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);
проблем не вызывает.
В чем, дело, подскажите, замучился совсем
Здравствуйте AiratSA, Вы писали:
ASA>[propput, id(diCurrentColName), helpstring("property CurrentColName")] HRESULT CurrentColName([in] BSTR newVal);
Покажи код Put_CurrentColName и как работаешь с принимаемой строкой. И что за ошибка.
Vi2>ASA>>[propput, id(diCurrentColName), helpstring("property CurrentColName")] HRESULT CurrentColName([in] BSTR newVal);
Vi2>
Vi2>Покажи код Put_CurrentColName и как работаешь с принимаемой строкой. И что за ошибка.
Код корректный. Из ActiveX Control Test Container все прекрасно работает. К тому же дело до вызова не доходит.Падает в тот момент, VBA пытается отобразить свойства в своем окне, Оно обычно находится в левом нижнем углу экрана. Такое впечатление, что VBA не нравится то, что находится в библиотеке типов, но что именно — не пойму.
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;
};
};
Здравствуйте Vi2, Вы писали:
Vi2>Похоже idl у тебя нормальный, если diCurrentColName константа определена и OLEView показывает корректный текст твоей TLB. Проверь, кстати, OLEView-ером.
Vi2>Поэтому всё же проблема в реализации методов.
Нашел ошибку. Она была в get_CurrentColName, но почему не проявлялась в ActiveX Control Test Container не понятно.
К сожалению, больше тройки поставить нельзя.
Здравствуйте AiratSA, Вы писали:
ASA>Нашел ошибку. Она была в get_CurrentColName, но почему не проявлялась в ActiveX Control Test Container не понятно.
Вот показал бы, что было неправильно, чтобы другие читатели об это не споткнулись, и оценку бы получил за решение проблемы.
А мне оценку ставить было не за что, да и не за оценки же помогаем, а для развитие своего брата-программиста. Хотя и приятно.
Здравствуйте 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();
}