C++ Builder
| Главная | Уроки | Статьи | FAQ | Форум | Downloads | Литература | Ссылки | RXLib | Диски |

 
Ошибка при подключении, shlobj.h или shobjidl.h
Booster
Отправлено: 23.07.2005, 10:12


Ученик-кочегар

Группа: Участник
Сообщений: 29



Помогите! Не пашит библиотека shlobj.h Скиньте пожалуйста по мылу! ohmy.gif
esh
Отправлено: 24.07.2005, 03:22


Дежурный стрелочник

Группа: Участник
Сообщений: 71



И первая ошибка
[C++ Error] shobjidl.h(2193): E2238 Multiple declaration for 'FOLDERSETTINGS'

У меня то же самое, пока времени небыло разбираться.
Вобщем и мне пришлите smile.gif

PS это не библиотека.
Doga
Отправлено: 25.07.2005, 11:41


Мастер участка

Группа: Участник
Сообщений: 575



2Booster

Что значит "Не пашит" ? Если Вы вручную не меяли его содержимое — всё должно работать. Подробнее можно?

2esh

У Вас то как раз всё в порядке smile.gif Просто в подключенных библиотеках есть два одинаковых обьявления. Эта ошибка устраняется указанием области видимости. Например:

CODE


Classes::TList *MyList;

esh
Отправлено: 25.07.2005, 17:54


Дежурный стрелочник

Группа: Участник
Сообщений: 71



Хотя подожди, я его не использую, только подключаю, а он уже ругается...
Doga
Отправлено: 25.07.2005, 17:58


Мастер участка

Группа: Участник
Сообщений: 575



A если не используешь — зачем подключать? smile.gif

Отредактировано Doga — 26/07/2005, 12:09
esh
Отправлено: 26.07.2005, 01:29


Дежурный стрелочник

Группа: Участник
Сообщений: 71



Проблема именно в shobjidl.h, вот он, если кому интересно
22КБ

User Attached Image Скачать файл
shobjidl.rar_


esh
Отправлено: 26.07.2005, 01:39


Дежурный стрелочник

Группа: Участник
Сообщений: 71



У меня ошибки возникают при подключении shobjidl.h или shlobj.h, но тоже в shobjidl.h.
Сегодня даже Билдер переустановил -- не помогло.

Все, начинаю ковырять файл...

Отредактировано Георгий — 26/07/2005, 22:38
esh
Отправлено: 26.07.2005, 02:31


Дежурный стрелочник

Группа: Участник
Сообщений: 71



Хе, там 10 тысяч строк...

Попробовал в пустом vcl проекте написать:

typedef struct random_struct
{
int i;
}FOLDERSETTINGS;

Эта фигня выдает ошибку, о которой я писал раньше.



Зато эти компилируются отлично:

typedef struct random_struct
{
int i;
}_FOLDERSETTINGS;

struct FOLDERSETTINGS
{
int i;
};

Я даже не знаю что делать...
esh
Отправлено: 26.07.2005, 03:21


Дежурный стрелочник

Группа: Участник
Сообщений: 71



Прогуглил, вот что получил:
QUOTE
I had the same error too. I was able to fix it by putting

#define NO_WIN32_LEAN_AND_MEAN

before

#include <vcl.h>

in the cpp file.


Отредактировано esh — 26/07/2005, 12:08
Doga
Отправлено: 26.07.2005, 12:19


Мастер участка

Группа: Участник
Сообщений: 575



CODE


namespace MySettings
{
 typedef struct random_struct
 {
    int i;
 }FOLDERSETTINGS;
}


MySettings::FOLDERSETTINGS FS;
esh
Отправлено: 27.07.2005, 02:42


Дежурный стрелочник

Группа: Участник
Сообщений: 71



Да не в этом дело. Структуру я создал для примера.
В shobjidl.h создается такая же (т.е. с таким же именем),
и именно это вызывает ошибку. Попробовал создать в пустом проекте,
та же ошибка, если создавать как

typedef struct random_struct
{
int i;
}FOLDERSETTINGS;

А если так

struct FOLDERSETTINGS
{
int i;
};

то никаких ошибок нет. Вот в чем дело.

А редактировать стандартные заголовки не хочется
Doga
Отправлено: 27.07.2005, 13:48


Мастер участка

Группа: Участник
Сообщений: 575



Всё БРЕД: {...В первом случае сама структура не создается, только определяется её тип (typedef).

Во втором  — сразу создаётся конкректный объект.
}

В первом случае вводится новое имя типа для уже существующего типа.
Во втором — объявляется новйый тип.

Вот и вся разница

Отредактировано Doga — 29/07/2005, 14:34
Booster
Отправлено: 27.07.2005, 20:15


Ученик-кочегар

Группа: Участник
Сообщений: 29



Так что делать? wink.gif
GIZMO
Отправлено: 27.07.2005, 22:39


Машинист паровоза

Группа: Участник
Сообщений: 174



QUOTE (Booster @ 27/07/2005, 20:15)
Так что делать? wink.gif

Project|Options|Directories/Conditionals в поле Conditionals Defines добавить NO_WIN32_LEAN_AND_MEAN
Booster
Отправлено: 28.07.2005, 21:46


Ученик-кочегар

Группа: Участник
Сообщений: 29



[C++ Error] E2075 Incorrect project override option: NO_WIN32_LEAN_AND_MEAN
[C++ Error] E2075 Incorrect project override option: NO_WIN32_LEAN_AND_MEAN
[C++ Error] Project1.cpp(28): E2451 Undefined symbol 'exception'


sad.gif sad.gif sad.gif
esh
Отправлено: 29.07.2005, 00:32


Дежурный стрелочник

Группа: Участник
Сообщений: 71



QUOTE
В первом случае сама структура не создается, только определяется её тип (typedef).

Во втором — сразу создаётся конкректный объект.

И где это во втором случае создается объект???

Там как раз определяется тип.

Отредактировано esh — 29/07/2005, 00:34
Doga
Отправлено: 29.07.2005, 12:34


Мастер участка

Группа: Участник
Сообщений: 575



2esh

Вы правы. Тип, конечно, определяется. ВСЁ БРЕД: {но одновремено с этим создаётся и сам объект. Доступ к нему имеется непосредственно сразу после его объявления.}

Здесь Вам никто не запретит использовать в качестве имени объекта имя типа.

Проблема у Вас возникнет когда Вы попытаетесь объявить ещё одну структуру такого типа:

CODE

FOLDERSETTINGS FS;


Компилятор выдаст ошибку, потому что объявление типа с таким именем уже существует (shobjidl.h).

Если Вы желаете определить свой собственный тип, не смотря на уже существующее объявление, воспльзуйтесь для него указанием конкретной области видимости (namespace). Пример см. выше.

Но мне кажется, проще изменить имя объявляемго Вами типа, чем городить, а затем, указывать для него область видимости smile.gif

Отредактировано Doga — 29/07/2005, 14:40
esh
Отправлено: 29.07.2005, 12:41


Дежурный стрелочник

Группа: Участник
Сообщений: 71



QUOTE
Вы правы. Тип, конечно, определяется, но одновремено с этим создаётся и сам объект. Доступ к нему имеется непосредственно сразу после его бъявления.


И как это к нему обратиться???

QUOTE
Если Вы желаете определить свой собственный тип, не смотря на уже существующее объявление, воспльзуйтесь для него указанием конкретной области видимости (namespace). Пример см. выше.

Но мне кажется, проще изменить имя объявляемго Вами типа, чем городить, а затем, указывать для него область видимости

Да не я его создаю, он определяется в стандартном заголовке. А менять его очень не хочется smile.gif
Doga
Отправлено: 29.07.2005, 14:22


Мастер участка

Группа: Участник
Сообщений: 575



Вместо файлов shobjidl.h и shlobj.h следует подключать shlobj.hpp

CODE

struct FOLDERSETTINGS
{
   int i;
};

FOLDERSETTINGS FOLDERSETTINGS;

FOLDERSETTINGS.i = 0;
esh
Отправлено: 29.07.2005, 15:23


Дежурный стрелочник

Группа: Участник
Сообщений: 71



Спасибо, теперь понял.
Георгий
Отправлено: 29.07.2005, 20:28


Почетный железнодорожник

Группа: Модератор
Сообщений: 874



QUOTE (Doga @ 29/07/2005, 15:22)
Вместо файлов shobjidl.h и shlobj.h следует подключать shlobj.hpp

5 баллов!! Самое эффективное и простое решение!
esh
Отправлено: 30.07.2005, 00:52


Дежурный стрелочник

Группа: Участник
Сообщений: 71



Только оно не помогает, хотя файл нормально подключается.

А вот и фрагмент из shlobj.hpp
CODE
#if defined(NO_WIN32_LEAN_AND_MEAN)
#include <ole2.h>
#include <prsht.h>
#include <commctrl.h>   // for LPTBBUTTON
#include <shlguid.h>
#include <shlobj.h>
#endif


Всеже приходится делать
#define NO_WIN32_LEAN_AND_MEAN
Doga
Отправлено: 30.07.2005, 22:11


Мастер участка

Группа: Участник
Сообщений: 575



Комментарий из shlobj.hpp:

QUOTE

//-- user supplied -----------------------------------------------------------
// If problems occur when compiling win32 structs, records, or
// unions, please define NO_WIN32_LEAN_AND_MEAN to force inclusion
// of Windows header files.


2Георгий

smile.gif
esh
Отправлено: 31.07.2005, 02:02


Дежурный стрелочник

Группа: Участник
Сообщений: 71



Об этом я и писал...
Booster
  Отправлено: 02.08.2005, 23:20


Ученик-кочегар

Группа: Участник
Сообщений: 29



СПАСИБО ВСЕМ!!!

Вернуться в Вопросы программирования в C++Builder