Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / А API-функции обязательно "декларировать"? / 25 сообщений из 33, страница 1 из 2
26.06.2015, 08:26
    #38993251
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
А API-функции обязательно "декларировать"?
Т.е. например (везде 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
26.06.2015, 10:44
    #38993366
egorych
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
А API-функции обязательно "декларировать"?
Дмитрий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
26.06.2015, 12:14
    #38993512
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
А API-функции обязательно "декларировать"?
egorychтак ругается на перегрузку, которая в С не поддерживается.
Только в одном случае ругается, а в другом нет.
Мне всегда казалось, что в C/C++ должно быть
1) Definition -собственно код ф-ции
2) Declaration -заголовок с параметрами (без кода) и точка с запятой на конце

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

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

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

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

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

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

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

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

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

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

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

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

Пока ты даёшь куски кода, сложно что-то сказать, что там и как.
...
Рейтинг: 0 / 0
27.06.2015, 14:20
    #38994293
egorych
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
А API-функции обязательно "декларировать"?
MasterZivПока ты даёшь куски кода, сложно что-то сказать, что там и как.пока понятно, что у него каким то образом нарушается ODR. И, что убирая декларацию из хидера, он эту ошибку маскирует.
В качестве предположения могу высказать идею, что в хидере нет include guard . Посмотреть на него было бы не лишним, конечно
...
Рейтинг: 0 / 0
29.06.2015, 18:26
    #38995299
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
А API-функции обязательно "декларировать"?
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
29.06.2015, 18:48
    #38995323
egorych
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
А API-функции обязательно "декларировать"?
Дмитрий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
30.06.2015, 02:26
    #38995484
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
А API-функции обязательно "декларировать"?
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
30.06.2015, 10:14
    #38995620
egorych
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
А API-функции обязательно "декларировать"?
Дмитрий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
30.06.2015, 23:15
    #38996403
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
А API-функции обязательно "декларировать"?
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
01.07.2015, 16:10
    #38997022
MasterZiv
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
А API-функции обязательно "декларировать"?
Дмитрий77,

Ну так давай её, ошибку-то, сюда...
...
Рейтинг: 0 / 0
01.07.2015, 16:49
    #38997076
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
А API-функции обязательно "декларировать"?
В первом посте еще дал:
Дмитрий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
01.07.2015, 17:34
    #38997132
egorych
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
А API-функции обязательно "декларировать"?
Дмитрий77Ошибка никуда не деласьподожди, а у тебя в License.h структра MODE_STATUS описана? похоже, что нет.
#include "include/aspr_api.h" добавь-ка в него.
...
Рейтинг: 0 / 0
01.07.2015, 18:04
    #38997158
Дмитрий77
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
А API-функции обязательно "декларировать"?
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
01.07.2015, 19:03
    #38997213
Изопропил
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
А API-функции обязательно "декларировать"?
Дмитрий77А #pragma comment(lib,"include/aspr_ide.lib") куда вставлять? В .h или .cpp?


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


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