Форум программистов, компьютерный форум, киберфорум
C++ Builder
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.54/26: Рейтинг темы: голосов - 26, средняя оценка - 4.54
 Аватар для ExpressS
5 / 8 / 2
Регистрация: 30.07.2012
Сообщений: 235

Использование dll, Declaration terminated incorrectly

19.12.2012, 15:02. Показов 5361. Ответов 47
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Делал все по инструкции Dynamic-Link Library: Теория + Практика
но вылазит ошибка вот что
[BCC32 Error] Unit4.cpp(10): E2040 Declaration terminated incorrectly
0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
19.12.2012, 15:02
Ответы с готовыми решениями:

Declaration terminated incorrectly
Здравствуйте, вот часть кода, проблемма в нем при компиляции выдаёт такую ошибку: E2040 Declaration terminated incorrectly в чем дело ?...

Declaration terminated incorrectly - C++
Привет всем.Вот код: //-------------все работает нормально for (int i=0;i<8;i++) {for (int j=0;j<20;j++) ...

Declaration terminated incorrectly
Помогите у меня две ошибки в коде, не могу понять в чем дело: перед 1-ым и 2-ым if-ом...

47
 Аватар для ExpressS
5 / 8 / 2
Регистрация: 30.07.2012
Сообщений: 235
19.12.2012, 15:14  [ТС]
вот dll файлы
file2.cpp
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
#include <vcl.h>
#include <windows.h>
#pragma hdrstop
//---------------------------------------------------------------------------
//   Important note about DLL memory management when your DLL uses the
//   static version of the RunTime Library:
//
//   If your DLL exports any functions that pass String objects (or structs/
//   classes containing nested Strings) as parameter or function results,
//   you will need to add the library MEMMGR.LIB to both the DLL project and
//   any other projects that use the DLL.  You will also need to use MEMMGR.LIB
//   if any other projects which use the DLL will be performing new or delete
//   operations on any non-TObject-derived classes which are exported from the
//   DLL. Adding MEMMGR.LIB to your project will change the DLL and its calling
//   EXE's to use the BORLNDMM.DLL as their memory manager.  In these cases,
//   the file BORLNDMM.DLL should be deployed along with your DLL.
//
//   To avoid using BORLNDMM.DLL, pass string information using "char *" or
//   ShortString parameters.
//
//   If your DLL uses the dynamic version of the RTL, you do not need to
//   explicitly add MEMMGR.LIB as this will be done implicitly for you
//---------------------------------------------------------------------------
 
#pragma argsused
#include "TestDLL.h" // создание этого заголовочного файла будет описано ниже
//---------------------------------------------------------------------------
void ShowSum(const int A, const int B)
{
  ShowMessage(IntToStr(A) + " + " + IntToStr(B) + " = " + IntToStr(A + B));
}
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
    return 1;
}
//--
testdll.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#ifndef __TESTDLL_H
#define __TESTDLL_H
 
/*
символ TESTDLL_EXPORTS по умолчанию определен в Вашем проекте (см. Project Options -> С/С++ -> General->Preprocessor Definitions).
При этом все экспортируемые идентификаторы предваряются символом DLL_SPEC.
В случае определения TESTDLL_EXPORTS в проекте DLL_SPEC определяется как экспортируемый объект; в случае же отсутствия такого определения мы получим импортируемый объект.
Таким образом, один и тот же заголовочный файл может быть использован и в DLL-проекте, и в проекте, который будет использовать данную DLL! Без каких-либо изменений.
*/
 
#ifdef TESTDLL_EXPORTS
#define DLL_SPEC extern "C" __declspec(dllexport)
 
#else
#define DLL_SPEC extern "C" __declspec(dllimport)
#endif // TESTDLL_EXPORTS
 
/*
Каждый экспортируемый идентификатор предваряем __declspec(dllexport).
Эта директива позволяет линкеру определить, что данный идентификатор следует экспортировать из DLL. При этом создается специальный lib-файл, который содержит все экспортируемые идентификаторы из модуля. Также экспортируемые объекты заносятся в раздел экспорта DLL.
*/
 
DLL_SPEC void ShowSum(const int A, const int B);
 
#endif // __TESTDLL_H
вот VSL
unit4.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
#include <vcl.h>
#pragma hdrstop
#include "TestDLL.h"
#include "Unit4.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
void DLL_SPEC ShowSum(const int A, const int B);
 
 
TForm4 *Form4;
//---------------------------------------------------------------------------
__fastcall TForm4::TForm4(TComponent* Owner)
    : TForm(Owner)
{
}
//---------------------------------------------------------------------------
------------
0
 Аватар для gumi250
435 / 402 / 57
Регистрация: 06.02.2012
Сообщений: 1,384
19.12.2012, 15:18
Самая последняя строка в последнем листинге состоящая из одних минусов, она и в коде у вас есть?
0
 Аватар для ExpressS
5 / 8 / 2
Регистрация: 30.07.2012
Сообщений: 235
19.12.2012, 15:21  [ТС]
и когда vsl запускаешь не кнопок нечего нету

Добавлено через 2 минуты
там все ок
вот эту строку красную выделяет
C++
1
void DLL_SPEC ShowSum(const int A, const int B);
0
 Аватар для gumi250
435 / 402 / 57
Регистрация: 06.02.2012
Сообщений: 1,384
19.12.2012, 15:22
Может ее в хидер стоит перенести, объявления ф-ций ставят там.
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
19.12.2012, 16:48
Возможно
C++
1
2
3
4
5
6
7
8
#include <vcl.h>
#pragma hdrstop
 
#define TESTDLL_EXPORTS
#include "TestDLL.h"
 
 
#include "Unit4.h"
Добавлено через 2 минуты
Ну а собственно TestDLL.lib подключили к проекту ?
0
 Аватар для ExpressS
5 / 8 / 2
Регистрация: 30.07.2012
Сообщений: 235
19.12.2012, 17:46  [ТС]
Конечно

Добавлено через 4 минуты
Далее, объявим прототип:
Код C++
1
void DLL_SPEC ShowSum(const int A, const int B);
где объявлять этот прототип?

Добавлено через 2 минуты
В проекте TestVCL подключим наш заголовочный файл:
Код C++
1
#include "TestDLL.h"
и вот это не понятно куда подключать ?
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
19.12.2012, 18:17
C++
1
2
#define TESTDLL_EXPORTS
#include "TestDLL.h"
В форме проекта
0
 Аватар для ExpressS
5 / 8 / 2
Регистрация: 30.07.2012
Сообщений: 235
19.12.2012, 22:47  [ТС]
теперь вот [ILINK32 Error] Error: Unresolved external '_ShowSum' referenced from D:\DLL\DEBUG\TESTVSL.OBJ
[ILINK32 Error] Error: Unable to perform link

Добавлено через 4 часа 9 минут
C++
1
void DLL_SPEC ShowSum(const int A, const int B);
вот это подчеркивает
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
19.12.2012, 22:52
C++
1
void DLL_SPEC ShowSum(const int A, const int B);
А где это вообще находится ?
Если в самом проекте, убери эту строчку
0
 Аватар для ExpressS
5 / 8 / 2
Регистрация: 30.07.2012
Сообщений: 235
19.12.2012, 23:00  [ТС]
Цитата Сообщение от Avazart Посмотреть сообщение
C++
1
void DLL_SPEC ShowSum(const int A, const int B);
А где это вообще находится ?
Если в самом проекте, убери эту строчку
Далее, объявим прототип:
Код C++
1
void DLL_SPEC ShowSum(const int A, const int B);
Теперь осталось только вызвать функцию там, где это необходимо.
Чтобы убедится в том, что всё работает, прописываем в конструкторе формы:
убрал теперь
[ILINK32 Error] Error: Unresolved external '_sum' referenced from D:\DLL\DEBUG\VSL.OBJ
[ILINK32 Error] Error: Unable to perform link
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
19.12.2012, 23:21
Ну хз выкладывайте весь проект целиком...
1
 Аватар для gumi250
435 / 402 / 57
Регистрация: 06.02.2012
Сообщений: 1,384
19.12.2012, 23:48
На тебе уже готовый пример.
Вложения
Тип файла: rar dll.rar (418.1 Кб, 19 просмотров)
1
 Аватар для ExpressS
5 / 8 / 2
Регистрация: 30.07.2012
Сообщений: 235
20.12.2012, 11:16  [ТС]
vsl
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
#include <vcl.h>
#pragma hdrstop
#include "File1.h"
#include "vsl.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
 
TForm4 *Form4;
int DLL_SPEC sum(int a,int b);
 
//---------------------------------------------------------------------------
__fastcall TForm4::TForm4(TComponent* Owner)
    : TForm(Owner)
{
}
 
//---------------------------------------------------------------------------
void __fastcall TForm4::Button1Click(TObject *Sender)
{
  Label1->Caption = sum(5,5);
}
//-------------
DLL
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
//---------------------------------------------------------------------------
 
#include <vcl.h>
#include <windows.h>
#pragma hdrstop
#include "File1.h"
//---------------------------------------------------------------------------
//   Important note about DLL memory management when your DLL uses the
//   static version of the RunTime Library:
//
//   If your DLL exports any functions that pass String objects (or structs/
//   classes containing nested Strings) as parameter or function results,
//   you will need to add the library MEMMGR.LIB to both the DLL project and
//   any other projects that use the DLL.  You will also need to use MEMMGR.LIB
//   if any other projects which use the DLL will be performing new or delete
//   operations on any non-TObject-derived classes which are exported from the
//   DLL. Adding MEMMGR.LIB to your project will change the DLL and its calling
//   EXE's to use the BORLNDMM.DLL as their memory manager.  In these cases,
//   the file BORLNDMM.DLL should be deployed along with your DLL.
//
//   To avoid using BORLNDMM.DLL, pass string information using "char *" or
//   ShortString parameters.
//
//   If your DLL uses the dynamic version of the RTL, you do not need to
//   explicitly add MEMMGR.LIB as this will be done implicitly for you
//---------------------------------------------------------------------------
 
#pragma argsused
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
    return 1;
}
   int sum(int a,int b)
   {
       return a+b*10;
   }
//---------------------------------------------------------------------------
file1.h
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
#ifndef __TESTDLL_H
#define __TESTDLL_H
 
/*
символ TESTDLL_EXPORTS по умолчанию определен в Вашем проекте (см. Project Options -> С/С++ -> General->Preprocessor Definitions).
При этом все экспортируемые идентификаторы предваряются символом DLL_SPEC.
В случае определения TESTDLL_EXPORTS в проекте DLL_SPEC определяется как экспортируемый объект; в случае же отсутствия такого определения мы получим импортируемый объект.
Таким образом, один и тот же заголовочный файл может быть использован и в DLL-проекте, и в проекте, который будет использовать данную DLL! Без каких-либо изменений.
*/
 
#ifdef TESTDLL_EXPORTS
#define DLL_SPEC extern "C" __declspec(dllexport)
 
#else
#define DLL_SPEC extern "C" __declspec(dllimport)
#endif // TESTDLL_EXPORTS
 
/*
Каждый экспортируемый идентификатор предваряем __declspec(dllexport).
Эта директива позволяет линкеру определить, что данный идентификатор следует экспортировать из DLL. При этом создается специальный lib-файл, который содержит все экспортируемые идентификаторы из модуля. Также экспортируемые объекты заносятся в раздел экспорта DLL.
*/
 
DLL_SPEC int sum(int a,int b);
 
#endif // __TESTDLL_H
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
20.12.2012, 11:47
Выложите проект архивом...
1
 Аватар для ExpressS
5 / 8 / 2
Регистрация: 30.07.2012
Сообщений: 235
20.12.2012, 15:36  [ТС]
вот посмотрите пожалуйста
Вложения
Тип файла: rar DLL.rar (4.19 Мб, 20 просмотров)
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
20.12.2012, 16:27
Кривой хедер dll.

C++
1
2
#ifndef __TESTDLL_H
#define __TESTDLL_H
А файл называется file.h а должен TESTDLL.h судя по эти макросам

Добавлено через 3 минуты
В общем копипаст не проканал ... читайте про "стражей включения"

Вместо
C++
1
2
3
4
5
6
#ifdef TESTDLL_EXPORTS
#define DLL_SPEC extern "C" __declspec(dllexport)
 
#else
#define DLL_SPEC extern "C" __declspec(dllimport)
#endif // TESTDLL_EXPORTS
Я бы писал так
C++
1
2
3
4
5
6
#ifdef __DLL__
#define DLL_SPEC extern "C" __declspec(dllexport)
 
#else
#define DLL_SPEC extern "C" __declspec(dllimport)
#endif // TESTDLL_EXPORTS
__DLL__ макрос который определяет среда если проект представляет собой dll и не определяет если это обычный проект
0
Практикантроп
 Аватар для nick42
4841 / 2726 / 534
Регистрация: 23.09.2011
Сообщений: 5,798
20.12.2012, 16:38
Если вам поможет пример, то вот весь текст Unit.cpp для создания dll, которая по запросам PutIntA(&int), GetIntA(&int) записывает-читает параметр из ини-файла в каталоге Винды.__
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
#include <vcl.h>
#include <windows.h>
#include <IniFiles.hpp>
#pragma hdrstop
//---------------------------------------------------------------------------
#pragma argsused
 
  TIniFile *mIni;
int WINAPI DllEntryPoint(HINSTANCE hinst, unsigned long reason, void* lpReserved)
{
   mIni = new TIniFile((String)getenv("windir")+"\\mydll.ini");
   return 1;
}
#define FUNC extern "C" void __stdcall
#define DECL extern "C" __declspec(dllexport) void __stdcall
 
  FUNC PutIntA(int &aa)  {
   if (mIni) mIni->WriteInteger("Main","Int",aa) ;
 }    DECL PutIntA(int &);
  FUNC GetIntA(int &aa)  {
   if (mIni) aa = mIni->ReadInteger("Main","Int",-1) ;
 }    DECL GetIntA(int &);
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
20.12.2012, 16:42
Почему MikeSoft вставил коментарий
C++
1
2
3
4
5
6
/*
символ TESTDLL_EXPORTS по умолчанию определен в Вашем проекте (см. Project Options -> С/С++ -> General->Preprocessor Definitions).
При этом все экспортируемые идентификаторы предваряются символом DLL_SPEC.
В случае определения TESTDLL_EXPORTS в проекте DLL_SPEC определяется как экспортируемый объект; в случае же отсутствия такого определения мы получим импортируемый объект.
Таким образом, один и тот же заголовочный файл может быть использован и в DLL-проекте, и в проекте, который будет использовать данную DLL! Без каких-либо изменений.
*/
и использует TESTDLL_EXPORTS мне не понятно, этот макрос вроде у меня не определен в среде.

Непонятно также зачем повторное объявление прототипа ф-ции в самом проекте

Также, не забываем сделать Project -> Add To Project и добавить в проект TestDLL.lib
Далее, объявим прототип:
C++
1
void DLL_SPEC ShowSum(const int A, const int B);
0
Эксперт С++
 Аватар для Avazart
8484 / 6151 / 615
Регистрация: 10.12.2010
Сообщений: 28,683
Записей в блоге: 30
20.12.2012, 17:20
Лучший ответ Сообщение было отмечено как решение

Решение

Вот переделал проект, но может не перекомпилиться на младших версиях так как у меня XE3.

В TESTDLL.cpp пришлось определить TESTDLL_EXPORTS что бы библиотека собралась по примеру MikeSoft

C++
1
2
#define TESTDLL_EXPORTS  // !!! !!! !!!
#include "TESTDLL.h"
Вложения
Тип файла: rar dll.rar (41.2 Кб, 158 просмотров)
4
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
20.12.2012, 17:20
Помогаю со студенческими работами здесь

Исправить ошибку в коде: E2040 Declaration terminated incorrectly
Ошибка указывает на первую строку, не могу понять Unit2.cpp(160): E2040 Declaration terminated incorrectly if(Edit1-&gt;Text...

[C++ Error] kurscpp.cpp(4): E2040 Declaration terminated incorrectly
#include &lt;windows.h&gt; #include &lt;stdio.h&gt; #pragma hdrstop extern &quot;C&quot; _stdcall DATE(char *, char *, char *); void main() { ...

"E2090: Qualifier 'Date0' is not a class or namespace name" и "E2040: Declaration terminated incorrectly"
Подскажите пожалуйста,в чем ошибка? //--------------------------------------------------------------------------- #include...

Ошибка при компиляции: "E2275 { expected" и "E2040 Declaration terminated incorrectly"
Здравствуйте! При компиляции выдает такую ошибку: C++ Error] Unit1.cpp(12): E2275 { expected Unit1.cpp(147): E2040 Declaration...

Declaration terminated incorrectly
#include&lt;stdio.h&gt; { int a,b,c; a=5; b=7; c=a*b; printf(&quot;multiplication=%d\n&quot;,c); } Помогите пожалуйста найти...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
20
Закрытая тема Создать тему
Новые блоги и статьи
Использование SDL3-callbacks вместо функции main() на Android, Desktop и WebAssembly
8Observer8 24.01.2026
Если вы откроете примеры для начинающих на официальном репозитории SDL3 в папке: examples, то вы увидите, что все примеры используют следующие четыре обязательные функции, а привычная функция main(). . .
моя боль
iceja 24.01.2026
Выложила интерполяцию кубическими сплайнами www. iceja. net REST сервисы временно не работают, только через Web. Написала за 56 рабочих часов этот сайт с нуля. При помощи perplexity. ai PRO , при. . .
Модель сукцессии микоризы
anaschu 24.01.2026
Решили писать научную статью с неким РОманом
http://iceja.net/ математические сервисы
iceja 20.01.2026
Обновила свой сайт http:/ / iceja. net/ , приделала Fast Fourier Transform экстраполяцию сигналов. Однако предсказывает далеко не каждый сигнал (см ограничения http:/ / iceja. net/ fourier/ docs ). Также. . .
http://iceja.net/ сервер решения полиномов
iceja 18.01.2026
Выкатила http:/ / iceja. net/ сервер решения полиномов (находит действительные корни полиномов методом Штурма). На сайте документация по API, но скажу прямо VPS слабенький и 200 000 полиномов. . .
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь(не выше 3-го порядка) постоянного тока с элементами R, L, C, k(ключ), U, E, J. Программа находит переходные токи и напряжения на элементах схемы классическим методом(1 и 2 з-ны. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru