Почему ошибка при формировании интерфейса?

0 голосов
спросил 22 Апр, 10 от dmitry12081973 (1,920 баллов) в категории Программные продукты Esri
Здравствуйте.
Подскажите, пожалуйста, что я не так делаю.

Создаю COM-объект в Delphi 7, при этом получаю автоматически с помощью делфиевского окна "COM Object Wizard" следующий код:

unit MAPCOMServerInit;

{$WARN SYMBOL_PLATFORM OFF}

interface

uses
  ComObj, ActiveX, MAPCOMServer_TLB, StdVcl, esriSystemUI_TLB;

type
  TMAPCOMServerDima = class(TAutoObject, ICommand)
  protected
    function Get_Caption: WideString; safecall;
    function Get_Category: WideString; safecall;
    function Get_Checked: WordBool; safecall;
    function Get_Enabled: WordBool; safecall;
    function Get_HelpContextID: Integer; safecall;
    function Get_HelpFile: WideString; safecall;
    function Get_Message: WideString; safecall;
    function Get_Name: WideString; safecall;
    function Get_Tooltip: WideString; safecall;
    function Get_Bitmap: OLE_HANDLE; safecall;
    procedure OnClick; safecall;
    procedure OnCreate(const hook: IDispatch); safecall;
  end;

implementation

uses ComServ;

function TMAPCOMServerDima.Get_Caption: WideString;
begin
end;

function TMAPCOMServerDima.Get_Category: WideString;
begin
end;

function TMAPCOMServerDima.Get_Checked: WordBool;
begin
end;

function TMAPCOMServerDima.Get_Enabled: WordBool;
begin
end;

function TMAPCOMServerDima.Get_HelpContextID: Integer;
begin
end;

function TMAPCOMServerDima.Get_HelpFile: WideString;
begin
end;

function TMAPCOMServerDima.Get_Message: WideString;
begin

end;

function TMAPCOMServerDima.Get_Name: WideString;
begin
end;

function TMAPCOMServerDima.Get_Tooltip: WideString;
begin
end;

function TMAPCOMServerDima.Get_Bitmap: OLE_HANDLE;
begin
end;

procedure TMAPCOMServerDima.OnClick;
begin
end;

procedure TMAPCOMServerDima.OnCreate(const hook: IDispatch);
begin
end;

initialization
  TAutoObjectFactory.Create(ComServer, TMAPCOMServerDima, Class_MAPCOMServerDima,
    ciMultiInstance, tmApartment);

В результате компиляции этого кода выдаётся ошибка:
Declaration of 'Get_Bitmap' differs from declaration in interface 'ICommand'

Смотрю исходный код файла esriSystemUI_TLB.pas, в котором этот ICommand объявлен и который соответственно взят в качестве предка для моего класса, вижу:

  ICommand = interface(IUnknown)
    ['{36B06538-4437-11D1-B970-080009EE4E51}']
    function Get_Enabled: WordBool; safecall;
    function Get_Checked: WordBool; safecall;
    function Get_Name: WideString; safecall;
    function Get_Caption: WideString; safecall;
    function Get_Tooltip: WideString; safecall;
    function Get_Message: WideString; safecall;
    function Get_HelpFile: WideString; safecall;
    function Get_HelpContextID: Integer; safecall;
    function Get_Category: WideString; safecall;
    procedure OnCreate(const hook: IDispatch); safecall;
    function Get_Bitmap: OLE_HANDLE; safecall;
    procedure OnClick; safecall;
    property Enabled: WordBool read Get_Enabled;
    property Checked: WordBool read Get_Checked;
    property Name: WideString read Get_Name;
    property Caption: WideString read Get_Caption;
    property Tooltip: WideString read Get_Tooltip;
    property Message: WideString read Get_Message;
    property HelpFile: WideString read Get_HelpFile;
    property HelpContextID: Integer read Get_HelpContextID;
    property Bitmap: OLE_HANDLE read Get_Bitmap;
    property Category: WideString read Get_Category;
  end;

То есть объявление функции Get_Bitmap точно такое же, как и в моём классе TMAPCOMServerDima.

Почему тогда ругается компилятор?

39 Ответы

0 голосов
ответил 25 Май, 10 от pooperec (10,820 баллов)
А если в
pQFilt.WhereClause := 'FID >= 0';
установить 'FID = 1'
ошибка тоже появляется?

Как у _Вас_ выглядят интерфейсы:
IFeatureLayer
IQueryFilter
IFeatureClass

Дайте CLSID CoQueryFilter`а.

При импортировании библиотек возникали ошибки, как Вы их устраняли?
0 голосов
ответил 25 Май, 10 от dmitry12081973 (1,920 баллов)
1.
>А если в
>pQFilt.WhereClause := 'FID >= 0';
>установить 'FID = 1'
>ошибка тоже появляется?

Да, появляется

2.
>Как у _Вас_ выглядят интерфейсы:
>IFeatureLayer
>IQueryFilter
>IFeatureClass

  IFeatureLayer = interface(ILayer)
    ['{40A9E885-5533-11D0-98BE-00805F7CED21}']
    function Get_FeatureClass: IFeatureClass; safecall;
    procedure _Set_FeatureClass(const fclass: IFeatureClass); safecall;
    function Get_DataSourceType: WideString; safecall;
    procedure Set_DataSourceType(const Text: WideString); safecall;
    function Get_DisplayField: WideString; safecall;
    procedure Set_DisplayField(const FieldName: WideString); safecall;
    function Get_Selectable: WordBool; safecall;
    procedure Set_Selectable(Value: WordBool); safecall;
    function Search(const queryFilter: IQueryFilter; recycling: WordBool): IFeatureCursor; safecall;
    function Get_ScaleSymbols: WordBool; safecall;
    procedure Set_ScaleSymbols(Scale: WordBool); safecall;
    property FeatureClass: IFeatureClass read Get_FeatureClass write _Set_FeatureClass;
    property DataSourceType: WideString read Get_DataSourceType write Set_DataSourceType;
    property DisplayField: WideString read Get_DisplayField write Set_DisplayField;
    property Selectable: WordBool read Get_Selectable write Set_Selectable;
    property ScaleSymbols: WordBool read Get_ScaleSymbols write Set_ScaleSymbols;
  end;

  IQueryFilter = interface(IUnknown)
    ['{FDFEBD93-ED75-11D0-9A95-080009EC734B}']
    function Get_SubFields: WideString; safecall;
    procedure Set_SubFields(const SubFields: WideString); safecall;
    procedure AddField(const subField: WideString); safecall;
    function Get_WhereClause: WideString; safecall;
    procedure Set_WhereClause(const WhereClause: WideString); safecall;
    function Get_OutputSpatialReference(const FieldName: WideString): ISpatialReference; safecall;
    procedure _Set_OutputSpatialReference(const FieldName: WideString;
                                          const OutputSpatialReference: ISpatialReference); safecall;
    property SubFields: WideString read Get_SubFields write Set_SubFields;
    property WhereClause: WideString read Get_WhereClause write Set_WhereClause;
    property OutputSpatialReference[const FieldName: WideString]: ISpatialReference read Get_OutputSpatialReference write _Set_OutputSpatialReference;
  end;

  IFeatureClass = interface(IObjectClass)
    ['{D4803EE6-79F4-11D0-97FC-0080C7F79481}']
    procedure GhostMethod_IFeatureClass_0_1; safecall;
    procedure GhostMethod_IFeatureClass_4_2; safecall;
    procedure GhostMethod_IFeatureClass_8_3; safecall;
    procedure GhostMethod_IFeatureClass_12_4; safecall;
    procedure GhostMethod_IFeatureClass_16_5; safecall;
    procedure GhostMethod_IFeatureClass_20_6; safecall;
    procedure GhostMethod_IFeatureClass_24_7; safecall;
    procedure GhostMethod_IFeatureClass_28_8; safecall;
    procedure GhostMethod_IFeatureClass_32_9; safecall;
    procedure GhostMethod_IFeatureClass_36_10; safecall;
    procedure GhostMethod_IFeatureClass_40_11; safecall;
    procedure GhostMethod_IFeatureClass_44_12; safecall;
    procedure GhostMethod_IFeatureClass_48_13; safecall;
    procedure GhostMethod_IFeatureClass_52_14; safecall;
    procedure GhostMethod_IFeatureClass_56_15; safecall;
    procedure GhostMethod_IFeatureClass_60_16; safecall;
    procedure GhostMethod_IFeatureClass_64_17; safecall;
    procedure GhostMethod_IFeatureClass_68_18; safecall;
    procedure GhostMethod_IFeatureClass_72_19; safecall;
    function Get_ShapeType: esriGeometryType; safecall;
    function Get_FeatureType: esriFeatureType; safecall;
    function Get_ShapeFieldName: WideString; safecall;
    function Get_AreaField: IField; safecall;
    function Get_LengthField: IField; safecall;
    function Get_FeatureDataset: IFeatureDataset; safecall;
    function CreateFeature: IFeature; safecall;
    function GetFeature(ID: Integer): IFeature; safecall;
    function GetFeatures(fids: OleVariant; Recycling: WordBool): IFeatureCursor; safecall;
    function Get_FeatureClassID: Integer; safecall;
    function CreateFeatureBuffer: IFeatureBuffer; safecall;
    function FeatureCount(const QueryFilter: IQueryFilter): Integer; safecall;
    function Search(const filter: IQueryFilter; Recycling: WordBool): IFeatureCursor; safecall;
    function Update(const filter: IQueryFilter; Recycling: WordBool): IFeatureCursor; safecall;
    function Insert(useBuffering: WordBool): IFeatureCursor; safecall;
    function Select(const QueryFilter: IQueryFilter; selType: esriSelectionType;
                    selOption: esriSelectionOption; const selectionContainer: IWorkspace): ISelectionSet; safecall;
    property ShapeType: esriGeometryType read Get_ShapeType;
    property FeatureType: esriFeatureType read Get_FeatureType;
    property ShapeFieldName: WideString read Get_ShapeFieldName;
    property AreaField: IField read Get_AreaField;
    property LengthField: IField read Get_LengthField;
    property FeatureDataset: IFeatureDataset read Get_FeatureDataset;
    property FeatureClassID: Integer read Get_FeatureClassID;
  end;

3.
>Дайте CLSID CoQueryFilter`а.

Не понял, что давать.

4.
>При импортировании библиотек возникали ошибки, как Вы их устраняли?

У меня не было ошибок при импортировании библиотек
0 голосов
ответил 25 Май, 10 от pooperec (10,820 баллов)
Не нравиться мне Ваш IFeatureClass, у меня он к примеру выглядит так:
IFeatureClass = interface(IObjectClass)
    ['{D4803EE6-79F4-11D0-97FC-0080C7F79481}']
    function Get_ShapeType: esriGeometryType; safecall;
    function Get_FeatureType: esriFeatureType; safecall;
    function Get_ShapeFieldName: WideString; safecall;
    function Get_AreaField: IField; safecall;
    function Get_LengthField: IField; safecall;
    function Get_FeatureDataset: IFeatureDataset; safecall;
    function CreateFeature: IFeature; safecall;
    function GetFeature(ID: Integer): IFeature; safecall;
    function GetFeatures(fids: OleVariant; Recycling: WordBool): IFeatureCursor; safecall;
    function Get_FeatureClassID: Integer; safecall;
    function CreateFeatureBuffer: IFeatureBuffer; safecall;
    function FeatureCount(const QueryFilter: IQueryFilter): Integer; safecall;
    function Search(const filter: IQueryFilter; Recycling: WordBool): IFeatureCursor; safecall;
    function Update(const filter: IQueryFilter; Recycling: WordBool): IFeatureCursor; safecall;
    function Insert(useBuffering: WordBool): IFeatureCursor; safecall;
    function Select(const QueryFilter: IQueryFilter; selType: esriSelectionType;
                    selOption: esriSelectionOption; const selectionContainer: IWorkspace): ISelectionSet; safecall;
    property ShapeType: esriGeometryType read Get_ShapeType;
    property FeatureType: esriFeatureType read Get_FeatureType;
    property ShapeFieldName: WideString read Get_ShapeFieldName;
    property AreaField: IField read Get_AreaField;
    property LengthField: IField read Get_LengthField;
    property FeatureDataset: IFeatureDataset read Get_FeatureDataset;
    property FeatureClassID: Integer read Get_FeatureClassID;
end;

1. Попробуйте вызвать ShapeFieldName, FeatureClassID, ошибки возникают?

1.1. А если переобъявить интерфейс так как у меня он выглядит?

2. IFeatureClass у Вас точно не равен nil?

>Не понял, что давать
GUID класса который реализует интерфейс IQueryFilter;
0 голосов
ответил 25 Май, 10 от dmitry12081973 (1,920 баллов)
Поменял объявление интерфейса IFeatureClass = interface(IObjectClass) на Ваш, заработало, но на строке

pGeometry := pFeature.Shape;

вылетает с ошибкой EOleException with message 'разрушительный сбой'

И как Вы только догадываетесь, в чём дело?
0 голосов
ответил 25 Май, 10 от pooperec (10,820 баллов)
Я, ?(*%ть, внук Павла Глобы, и прямой наследник Нострадамуса! Я Вам говорил, прочитать про технологию СОМ?

1. pFeature, у Вас = nil, либо pFeature.shape = nil.
1.1. Сколько раз цикл проходит?
1.2. Какие условия запроса, Вы меняли?
2. Показывайте интерфейс IGeometry.
0 голосов
ответил 25 Май, 10 от dmitry12081973 (1,920 баллов)
Я помню, что нужно контролировать на nil, pFeature = Pointer($15A3110) as IFeature, а вот pFeature.Shape возвращает ошибку почему-то, при чём на первом же проходе цикла.
Вот интерфейс IGeometry:
  IGeometry = interface(IUnknown)
    ['{1B07790D-38C5-11D0-92D2-00805F7C28B0}']
    function Get_GeometryType: esriGeometryType; safecall;
    function Get_Dimension: esriGeometryDimension; safecall;
    function Get_SpatialReference: ISpatialReference; safecall;
    procedure _Set_SpatialReference(const spatialRef: ISpatialReference); safecall;
    function Get_IsEmpty: WordBool; safecall;
    procedure SetEmpty; safecall;
    procedure QueryEnvelope(const outEnvelope: IEnvelope); safecall;
    function Get_Envelope: IEnvelope; safecall;
    procedure Project(const newReferenceSystem: ISpatialReference); safecall;
    procedure SnapToSpatialReference; safecall;
    procedure GeoNormalize; safecall;
    procedure GeoNormalizeFromLongitude(Longitude: Double); safecall;
    property GeometryType: esriGeometryType read Get_GeometryType;
    property Dimension: esriGeometryDimension read Get_Dimension;
    property SpatialReference: ISpatialReference read Get_SpatialReference write _Set_SpatialReference;
    property IsEmpty: WordBool read Get_IsEmpty;
    property Envelope: IEnvelope read Get_Envelope;
  end;


0 голосов
ответил 25 Май, 10 от pooperec (10,820 баллов)
Если создать переменную типа IGeometry и ей присваивать, ошибка появляется? проверка этой переменной на nil что дает?

Поищите по модулям методы которые начинаются с "GhostMethod", как в Вашем старом IFeatureClass, и удалите эти методы.
0 голосов
ответил 26 Май, 10 от TDenis (42,620 баллов)
Извините, что вмешиваюсь. Я по делфям не специалист, поэтому довольно интересно читать, что вы тут пишете.
И, наверное, это не моё дело, но.

dmitry12081973
Вы уже сколько времени своё мега-приложение ваяете? Судя по Вашим темам на нескольких форумах - месяца два, а то и больше, так? И всё ещё такие вопросы задаёте.
Договорились бы, наняли бы человека на пару дней, чтобы он сделал Вам простенький проект, рассказал что такое ArcGIS, что такое ArcView/ArcEditor/ArcInfo, показал возможности, показал, как создавать приложения, и что для этого нужно. Уже бы давно научились бы, решили бы покупать ли Вам аркгис или нет, и спокойно бы двигались дальше. Тем более, если работаете на одном из языков/платформ/сред, полноценной поддержки которых в аркгисе сейчас нет.
Просто ппц у вас экономия, простите.
0 голосов
ответил 27 Май, 10 от dmitry12081973 (1,920 баллов)
Ярослав, спасибо!!!
У меня получилось, наконец-то всё написанное работает!!!
Добро пожаловать на сайт Вопросов и Ответов, где вы можете задавать вопросы по GIS тематике и получать ответы от других членов сообщества.
...