powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / А API-функции обязательно "декларировать"?
25 сообщений из 33, страница 1 из 2
А API-функции обязательно "декларировать"?
    #38993251
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Т.е. например (везде extern "C" ):

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
в .h
BOOL __stdcall CPP7_Get_KeyDate(BYTE ModeId, WORD * Day, WORD * Month, WORD * Year);

в .cpp
BOOL __stdcall CPP7_Get_KeyDate(BYTE ModeId, WORD * Day, WORD * Month, WORD * Year)
{ 
  return GetKeyDate(ModeId, Day, Month, Year);
}


Но без .h тоже компилируется и работает.

А вот если вот так (со структурой):
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
в .h
BOOL __stdcall CPP7_Check_Key(char* Key, char* Name, PMODE_STATUS ModeStatus);

в .cpp
BOOL __stdcall CPP7_Check_Key(char* Key, char* Name, PMODE_STATUS ModeStatus)
{ 
  return CheckKey(Key, Name, ModeStatus);
}


то еще и ругается
1>.\License.cpp(28) : error C2733: second C linkage of overloaded function 'CPP7_Check_Key' not allowed
1> .\License.cpp(27) : see declaration of 'CPP7_Check_Key'
если убрать, то компилируется и работает

Мож .h вообще выкинуть?
...
Рейтинг: 0 / 0
А API-функции обязательно "декларировать"?
    #38993366
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77везде extern "C"
...
то еще и ругается
1>.\License.cpp(28) : error C2733: second C linkage of overloaded function 'CPP7_Check_Key' not allowed
1> .\License.cpp(27) : see declaration of 'CPP7_Check_Key'так ругается на перегрузку, которая в С не поддерживается.

а "работает" что значит?
...
Рейтинг: 0 / 0
А API-функции обязательно "декларировать"?
    #38993512
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychтак ругается на перегрузку, которая в С не поддерживается.
Только в одном случае ругается, а в другом нет.
Мне всегда казалось, что в C/C++ должно быть
1) Definition -собственно код ф-ции
2) Declaration -заголовок с параметрами (без кода) и точка с запятой на конце

Хотя по логике, если я ее не вызываю внутри самой dll, наверно и декларировать ее ни к чему.

egorychа "работает" что значит?
Ну, значит вызывается из другого приложения (.Net в моем случае) и возвращает правдоподобный результат.
...
Рейтинг: 0 / 0
А API-функции обязательно "декларировать"?
    #38993525
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77,

декларировать нужно.
особенно в С++, где функции по умолчанию нифига не extern c
...
Рейтинг: 0 / 0
А API-функции обязательно "декларировать"?
    #38993527
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Мне всегда казалось, что в C/C++ должно быть
1) Definition -собственно код ф-ции
2) Declaration -заголовок с параметрами (без кода) и точка с запятой на концев С декларация - необязательна, но рекомендована, в С++, насколько помню, обязательна.
Дмитрий77Ну, значит вызывается из другого приложения (.Net в моем случае) и возвращает правдоподобный результат.а ты обе-две функции из Net можешь вызвать одновременно?
...
Рейтинг: 0 / 0
А API-функции обязательно "декларировать"?
    #38993574
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychв С декларация - необязательна, но рекомендована
только почему-то ругается на "дубликат", и только тогда когда структура в параметре.

egorychа ты обе-две функции из Net можешь вызвать одновременно?
в смысле 2 разных (с разным именем)?
и что значит одновременно?
ну, последовательно на кнопочки нажимаю (в продакшн тоже своя логика), разные вызываю
потоками не увлекаюсь
все что сделал, все работает
...
Рейтинг: 0 / 0
А API-функции обязательно "декларировать"?
    #38993658
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorych2) Declaration -заголовок с параметрами (без кода) и точка с запятой на концев С декларация - необязательна, но рекомендована, в С++, насколько помню, обязательна.[/quot]

Дело не в этом, а в том, что любое определение является и декларацией (объявлением) тоже.
Но просто extern C не проставить по-нормальному без объявления.
...
Рейтинг: 0 / 0
А API-функции обязательно "декларировать"?
    #38993711
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivособенно в С++, где функции по умолчанию нифига не extern c
у меня как в .cpp, так и в .h все находится внутри блоков

Код: plaintext
1.
2.
3.
extern "C" {
...
}; // extern "C"
...
Рейтинг: 0 / 0
А API-функции обязательно "декларировать"?
    #38993756
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77,

Ну ок, так в чём проблема оставить и определение, и объявление ?
...
Рейтинг: 0 / 0
А API-функции обязательно "декларировать"?
    #38993757
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77:
>>в смысле 2 разных (с разным именем)?
нет, с одинаковым, но с разными параметрами. Ты ж говоришь, что компилируется у тебя.
>>и что значит одновременно?
без пересборки библиотеки. Сначала одну функцию вызвал, потом - другую. Интересно, вызовятся разные функции, или одна и та же. Си умеет ведь int в указатель молча преобразовывать. WORD - это инт же, а PMODE_STATUS - указатель.
...
Рейтинг: 0 / 0
А API-функции обязательно "декларировать"?
    #38993759
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivДмитрий77,

Ну ок, так в чём проблема оставить и определение, и объявление ?боязнь файлов развилась этим летом на sql.ru )))
были и более экзотические хотелки в Программировании недавно ))
...
Рейтинг: 0 / 0
А API-функции обязательно "декларировать"?
    #38993767
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77,

У тебя там проблема в том, видимо, что твоя функция ' CPP7_Check_Key ' определена несколько раз. Т.е. их две.
Поищи просто по коду.
...
Рейтинг: 0 / 0
А API-функции обязательно "декларировать"?
    #38993790
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZiv,

А чего искать то, он мою "декларацию" за второе "определение" принимает, вот конкретно когда со структурой PMODE_STATUS ModeStatus. Убрал декларацию и все OK. Бог с ним, работает и ладно.
Предполагаю, что если определение заключено в extern "C" , то отдельная декларация не нужна и вредна.
...
Рейтинг: 0 / 0
А API-функции обязательно "декларировать"?
    #38994068
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77MasterZiv,

А чего искать то, он мою "декларацию" за второе "определение" принимает, вот конкретно когда со структурой PMODE_STATUS ModeStatus. Убрал декларацию и все OK. Бог с ним, работает и ладно.
Предполагаю, что если определение заключено в extern "C" , то отдельная декларация не нужна и вредна.

Предполагаешь неверно.

Пока ты даёшь куски кода, сложно что-то сказать, что там и как.
...
Рейтинг: 0 / 0
А API-функции обязательно "декларировать"?
    #38994293
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivПока ты даёшь куски кода, сложно что-то сказать, что там и как.пока понятно, что у него каким то образом нарушается ODR. И, что убирая декларацию из хидера, он эту ошибку маскирует.
В качестве предположения могу высказать идею, что в хидере нет include guard . Посмотреть на него было бы не лишним, конечно
...
Рейтинг: 0 / 0
А API-функции обязательно "декларировать"?
    #38995299
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivПока ты даёшь куски кода, сложно что-то сказать, что там и как.
Если вам это интересно, то вот "полный" код.

Код: plaintext
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.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
55.
56.
57.
58.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
73.
74.
75.
76.
77.
78.
79.
80.
81.
82.
83.
84.
85.
86.
87.
88.
89.
90.
91.
92.
93.
// License.h
#ifdef __cplusplus
extern "C" {
#endif

//BOOL __stdcall CPP7_Check_Key(char* Key, char* Name, PMODE_STATUS ModeStatus);
...

#ifdef __cplusplus
};
#endif

//====================================

// License.cpp : Defines the entry point for the DLL application.
//

#include "stdafx.h"
#include "License.h"

#include "include/aspr_api.h"
//#include "include/asprotect.h"

#pragma comment(lib,"include/aspr_ide.lib")


#ifdef _MANAGED
#pragma managed(push, off)
#endif

BOOL APIENTRY DllMain( HMODULE hModule,
                       DWORD  ul_reason_for_call,
                       LPVOID lpReserved
					 )
{
    return TRUE;
}

extern "C" {

BOOL __stdcall CPP7_Check_Key(char* Key, char* Name, PMODE_STATUS ModeStatus)
{ 
  return CheckKey(Key, Name, ModeStatus);
}

...

}; // extern "C"

#ifdef _MANAGED
#pragma managed(pop)
#endif

//====================================

// aspr_api.h : Defines API functions.
//

#ifndef ASPR_API_H
#define ASPR_API_H

// Mode status

typedef struct _MODE_STATUS {
    BYTE ModeId;
    bool IsRegistered,
    	 IsKeyPresent,
    	 IsWrongHardwareID,
    	 IsKeyExpired,
    	 IsModeExpired,
    	 IsBlackListedKey,
    	 IsModeActivated;
}MODE_STATUS, *PMODE_STATUS;

#ifdef __BORLANDC__
...
#else

...
 extern "C" BOOL  __stdcall CheckKey( char* Key, char* Name, PMODE_STATUS mode_status );
...

#endif

#endif

//====================================
// License.def

LIBRARY   License
EXPORTS
   CPP7_Check_Key   @1
...
...
Рейтинг: 0 / 0
А API-функции обязательно "декларировать"?
    #38995323
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77вот "полный" код.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
// License.h
#ifdef __cplusplus
extern "C" {
#endif

//BOOL __stdcall CPP7_Check_Key(char* Key, char* Name, PMODE_STATUS ModeStatus);
...

#ifdef __cplusplus
};
#endif

так есть у тебя в License.h include guard то? по представленному видно, что - нет.
...
Рейтинг: 0 / 0
А API-функции обязательно "декларировать"?
    #38995484
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorychтак есть у тебя в License.h include guard то? по представленному видно, что - нет.
Ну конечно нет. Я не знаю что это такое и даже не сильно горю желанием узнать.

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
// License.h
#include guard
#ifdef __cplusplus
extern "C" {
#endif

//BOOL __stdcall CPP7_Check_Key(char* Key, char* Name, PMODE_STATUS ModeStatus);
...

#ifdef __cplusplus
};
#endif



1>License.h(2) : error C2006: '#include' : expected a filename, found 'identifier'
1>License.h(2) : fatal error C1083: Cannot open include file: '': No such file or directory

Либо просто напиши как правильно,
либо тему закрываем и я удовлетворяюсь этим:
egorychчто убирая декларацию из хидера, он эту ошибку маскирует.
...
Рейтинг: 0 / 0
А API-функции обязательно "декларировать"?
    #38995620
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Ну конечно нет. Я не знаю что это такое и даже не сильно горю желанием узнать.я ссылку давал, тащемта. Не читатель?
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
// aspr_api.h : Defines API functions.
//
#ifndef ASPR_API_H
#define ASPR_API_H
....

#endif

выделенное - называется include guard
...
Рейтинг: 0 / 0
А API-функции обязательно "декларировать"?
    #38996403
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorych,

Ну написал вот так:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
// License.h
#ifndef LICENSE_H
#define LICENSE_H

#ifdef __cplusplus
extern "C" {
#endif

BOOL __stdcall CPP7_Check_Key(char* Key, char* Name, PMODE_STATUS ModeStatus);
...

#ifdef __cplusplus
};
#endif

#endif


Ошибка никуда не делась (если не комментировать).
...
Рейтинг: 0 / 0
А API-функции обязательно "декларировать"?
    #38997022
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77,

Ну так давай её, ошибку-то, сюда...
...
Рейтинг: 0 / 0
А API-функции обязательно "декларировать"?
    #38997076
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
В первом посте еще дал:
Дмитрий77то еще и ругается
1>.\License.cpp(28) : error C2733: second C linkage of overloaded function 'CPP7_Check_Key' not allowed
1> .\License.cpp(27) : see declaration of 'CPP7_Check_Key'
если убрать, то компилируется и работает
...
Рейтинг: 0 / 0
А API-функции обязательно "декларировать"?
    #38997132
egorych
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77Ошибка никуда не деласьподожди, а у тебя в License.h структра MODE_STATUS описана? похоже, что нет.
#include "include/aspr_api.h" добавь-ка в него.
...
Рейтинг: 0 / 0
А API-функции обязательно "декларировать"?
    #38997158
Дмитрий77
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
egorych,

фу-ты нуты

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
// License.h

#include "include/aspr_api.h"
//#include "include/asprotect.h"

#pragma comment(lib,"include/aspr_ide.lib")

====
// License.cpp : Defines the entry point for the DLL application.
//

#include "stdafx.h"
#include "License.h"



Все, понятно. Так компилируется. Ну редко я к C++ обращаюсь, нет автоматических навыков.

А #pragma comment(lib,"include/aspr_ide.lib") куда вставлять? В .h или .cpp?
Я в .h все перенес.

P.S. Скорее всего авторы доков не предполагают использование .h с декларациями (судя по тому как их примеры оформлены).
...
Рейтинг: 0 / 0
А API-функции обязательно "декларировать"?
    #38997213
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Дмитрий77А #pragma comment(lib,"include/aspr_ide.lib") куда вставлять? В .h или .cpp?


в make
...
Рейтинг: 0 / 0
25 сообщений из 33, страница 1 из 2
Форумы / C++ [игнор отключен] [закрыт для гостей] / А API-функции обязательно "декларировать"?
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]