powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / DnsValidateName()
11 сообщений из 11, страница 1 из 1
DnsValidateName()
    #34769589
Tubrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
в чем тут дело?
Код: plaintext
1.
xxx error LNK2019: unresolved external symbol _DnsValidateName_A referenced in function "bool __cdecl IsValidDns(char const *)" (?IsValidDns@@YA_NPBD@Z)


Dnsapi.lib и windns.h, вроде все как полагается, к тому же ф-ия DnsQuery() в этом же модуле чувствует себя отлично..
...
Рейтинг: 0 / 0
DnsValidateName()
    #34769644
teras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Похоже на косяк в заголовке. DnsValidateName_* в библиотеке реализованы как __stdcall, но в прототипе этого нет.
Нужно или включить глобально использование __stdcall (после чего скорее всего полетит еще куча вещей, но, видимо,именно так делают в MS), или поправить заголовок, добавив WINAPI в объявление DnsValidateName_*:

Код: plaintext
1.
2.
3.
4.
5.
6.
DNS_STATUS
WINAPI
DnsValidateName_A(
    IN      LPCSTR          pszName,
    IN      DNS_NAME_FORMAT Format
    );
...
Рейтинг: 0 / 0
DnsValidateName()
    #34769654
Tubrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
terasПохоже на косяк в заголовке. DnsValidateName_* в библиотеке реализованы как __stdcall, но в прототипе этого нет.
Нужно или включить глобально использование __stdcall (после чего скорее всего полетит еще куча вещей, но, видимо,именно так делают в MS), или поправить заголовок, добавив WINAPI в объявление DnsValidateName_*:

Код: plaintext
1.
2.
3.
4.
5.
6.
DNS_STATUS
WINAPI
DnsValidateName_A(
    IN      LPCSTR          pszName,
    IN      DNS_NAME_FORMAT Format
    );


Спасибо, добавил WINAPI в WinDNS.h и все ок.
Хотя наверно так делать не есть хорошо.
...
Рейтинг: 0 / 0
DnsValidateName()
    #34769807
teras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TubrikХотя наверно так делать не есть хорошо. Наверняка исправят в следующих версиях. А если не хочется править чужие исходники - можно пользовать препроцессор:

mydns.h:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
/* PURPOSE: fix invalid DnsValidateName_A prototype in windns.h */

#if (WINVER > 0x0501)
#error "Please, check if windns.h still contains invalid DnsValidateName_A prototype and remove this directive if the propotype is valid */
#include <windns.h>
#else

/* exclude MS supplied one, preventing type mismatch error */
#define DnsValidateName_A DnsValidateName_A_WRONG
#include <windns.h>
/* revert to the original name */
#undef DnsValidateName_A

/* provide valid propotype */
DNS_STATUS
WINAPI
DnsValidateName_A(
    IN      LPCSTR          pszName,
    IN      DNS_NAME_FORMAT Format
    );
#endif /* WINVER check */
...
Рейтинг: 0 / 0
DnsValidateName()
    #34770239
Tubrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
не могу сообразить, как использовать последний приведенный вами код (
...
Рейтинг: 0 / 0
DnsValidateName()
    #34770311
teras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Tubrikне могу сообразить, как использовать последний приведенный вами код ( Закинуть в головной файл и подключать его вместо windns.h.
Первая проверка (#if WINVER > 0x0501) сделана для того, чтобы не забыть проверить на корректное объявление в будущих версиях SDK и отключить хак прототипа. Затем подключается оригинальный хидер, но прототип функции DnsValidateName_A переименовывается в прототип DnsValidateName_A_WRONG. После этого описывается правильный прототип для DnsValidateName_A.
...
Рейтинг: 0 / 0
DnsValidateName()
    #34770323
Tubrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
teras Tubrikне могу сообразить, как использовать последний приведенный вами код ( Закинуть в головной файл и подключать его вместо windns.h.
Первая проверка (#if WINVER > 0x0501) сделана для того, чтобы не забыть проверить на корректное объявление в будущих версиях SDK и отключить хак прототипа. Затем подключается оригинальный хидер, но прототип функции DnsValidateName_A переименовывается в прототип DnsValidateName_A_WRONG. После этого описывается правильный прототип для DnsValidateName_A.

Именно так и делал, но что-то действует.
...
Рейтинг: 0 / 0
DnsValidateName()
    #34770332
teras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
TubrikИменно так и делал, но что-то действует. Не скажу, что понял о чем вы. Возможно, вы забыли extern "C" {} вокруг заголовка, или перед функцией?
...
Рейтинг: 0 / 0
DnsValidateName()
    #34770335
Tubrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
авторЗакинуть в головной файл и подключать его вместо windns.h.

Имел ввиду, что сделал так..

авторВозможно, вы забыли extern "C" {} вокруг заголовка, или перед функцией?

Где именно нужно поставить extern "C" {} ?
...
Рейтинг: 0 / 0
DnsValidateName()
    #34770348
teras
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Код: 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.
#ifndef _MYDNS_H_
#define _MYDNS_H_

#ifdef __cplusplus
extern "C" {
#endif /* __cplusplus */

/* PURPOSE: fix invalid DnsValidateName_A prototype in windns.h */

#if (WINVER > 0x0501)
#error "Please, check if windns.h still contains invalid DnsValidateName_A prototype and remove this directive if the propotype is valid */
#include <windns.h>
#else

/* exclude MS supplied one, preventing type mismatch error */
#define DnsValidateName_A DnsValidateName_A_WRONG
#include <windns.h>
/* revert to the original name */
#undef DnsValidateName_A

/* provide valid propotype */
DNS_STATUS
WINAPI
DnsValidateName_A(
    IN      LPCSTR          pszName,
    IN      DNS_NAME_FORMAT Format
    );

#endif /* WINVER check */

#ifdef __cplusplus
}
#endif /* __cplusplus */
#endif /* _MYDNS_H_ */

Или

Код: plaintext
1.
2.
3.
4.
5.
6.
extern "C"
DNS_STATUS
WINAPI
DnsValidateName_A(
    IN      LPCSTR          pszName,
    IN      DNS_NAME_FORMAT Format
    );
...
Рейтинг: 0 / 0
DnsValidateName()
    #34770356
Tubrik
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
все работает, спасибо

только допер как работает эта манипуляция:
Код: plaintext
1.
2.
3.
4.
5.
/* exclude MS supplied one, preventing type mismatch error */
#define DnsValidateName_A DnsValidateName_A_WRONG
#include <windns.h>
/* revert to the original name */
#undef DnsValidateName_A

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


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