Проблема с #import под VC.NET
От: Vinny  
Дата: 24.08.04 11:03
Оценка:
Всем добрый день!

Уважаемые коллеги, подскажите, пожалуйста, возможное разрешение проблемы.

В проекте используется низкоуровневый компонент-обертка над ADO из
проекта Duwamish — db3vbdal.dll (Duwamish Books, Phase 3),
ребята из этой группы разработали компонент еще под Visual Basic 6.0 с учетом ADO 2.0
(заполучить библиотеку и исходники в можно в комплекте с MSDN "April 2001",
либо пишите мне мылом, вышлю)

У нас этот компонент использовался для компонента бизнес-логики таким образом:

//....
import "helper.idl";//для ADO
[
    object,
    uuid(3A4F53E2-DCBF-11D6-9C21-0000B4A6D518),
    helpstring("IBLogic Interface"),
    pointer_default(unique)
]

interface IBLogic : IUnknown
{
    [helpstring("method InsertSomething")] 
    HRESULT InsertSomething([in, out] _Recordset **ppNewSomething, 
               [out, retval] VARIANT_BOOL *pbSuccess);
    //и т.д.
}

[
    uuid(8E9082D5-9CCE-4E35-9596-FE7EC7CD5981),
    version(1.0),
    helpstring("BLogic 1.0 Type Library")
]
library BLogicLib
{
    importlib("stdole32.tlb");
    importlib("stdole2.tlb");

    [
        uuid(3A4F53E3-DCBF-11D6-9C21-0000B4A6D518),
        helpstring("BusinessLogic Class")
    ]
    coclass BLogic
    {
        [default] interface IBLogic;
    };

};

В файле stdafx.h мы подключали библиотеку ADO так;

//....
#import <msado15.dll> no_namespace named_guids \
 rename("EOF", "adoEOF") rename("Recordset", "adoRecordset")

И следом подключали библиотеку из проекта Duwamish;
#import "/*путь*/db3vbdal.dll" no_namespace named_guids rename("EOF", "EndOfFile")

...компилируем...

Далее, следовал _третий_ уровень в нашей модели,
а именно создание компонента с подключением в нем библиотеки BLogicLib.
Код его, сейчас, уже не имеет значения, важно что в stdafx.h мы подключали нашу библиотеку так;
#import "/*путь*/BLogic.dll" no_namespace named_guids rename("EOF", "adoEOF")


Совсем недавно понадобилось мне кое-что переписать в проекте на VC.NET и
при этом, во время компиляции компанюги _третьего_ уровня, выскочили ошибки;
/*путь*/BLogic.tlh: error C2146: syntax error : missing ';' before identifier 'PositionEnum_Param'
/*путь*/BLogic.tlh: error C2501: 'PositionEnum_Param' : missing storage-class or type specifiers
/*путь*/BLogic.tlh: error C2371: 'PositionEnum' : redefinition; different basic types
/*путь*/BLogic.tlh: error C2146: syntax error : missing ';' before identifier 'AbsolutePosition'

и еще 38 подобных ругательств компилятора на 'PositionEnum_Param' в файле BLogic.tlh (!)
В самом файле tlh строка преткновения выглядит так;
....
typedef PositionEnum PositionEnum_Param;
typedef enum __MIDL___MIDL_itf_BLogic_0253_0013 PositionEnum;
....

Как я не пытался возиться с директивами #import, ничего не вышло...
Почему компилятор или midl не может разобраться со своими кросс-определениями, непонятно...
В приступе уныния написал в stdafx.h так;
typedef enum __MIDL___MIDL_itf_BLogic_0253_0013 PositionEnum;
#import "/*путь*/BLogic.dll" no_namespace named_guids rename("EOF", "adoEOF")

всё скопмоновалось, но это ведь неправильно?
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.