Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / DnsValidateName() / 11 сообщений из 11, страница 1 из 1
01.09.2007, 11:46:40
    #34769589
Tubrik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DnsValidateName()
в чем тут дело?
Код: 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
01.09.2007, 12:51:54
    #34769644
teras
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DnsValidateName()
Похоже на косяк в заголовке. 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
01.09.2007, 13:08:13
    #34769654
Tubrik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DnsValidateName()
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
01.09.2007, 18:09:27
    #34769807
teras
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DnsValidateName()
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
02.09.2007, 15:14:46
    #34770239
Tubrik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DnsValidateName()
не могу сообразить, как использовать последний приведенный вами код (
...
Рейтинг: 0 / 0
02.09.2007, 17:09:30
    #34770311
teras
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DnsValidateName()
Tubrikне могу сообразить, как использовать последний приведенный вами код ( Закинуть в головной файл и подключать его вместо windns.h.
Первая проверка (#if WINVER > 0x0501) сделана для того, чтобы не забыть проверить на корректное объявление в будущих версиях SDK и отключить хак прототипа. Затем подключается оригинальный хидер, но прототип функции DnsValidateName_A переименовывается в прототип DnsValidateName_A_WRONG. После этого описывается правильный прототип для DnsValidateName_A.
...
Рейтинг: 0 / 0
02.09.2007, 17:19:09
    #34770323
Tubrik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DnsValidateName()
teras Tubrikне могу сообразить, как использовать последний приведенный вами код ( Закинуть в головной файл и подключать его вместо windns.h.
Первая проверка (#if WINVER > 0x0501) сделана для того, чтобы не забыть проверить на корректное объявление в будущих версиях SDK и отключить хак прототипа. Затем подключается оригинальный хидер, но прототип функции DnsValidateName_A переименовывается в прототип DnsValidateName_A_WRONG. После этого описывается правильный прототип для DnsValidateName_A.

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

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

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

Где именно нужно поставить extern "C" {} ?
...
Рейтинг: 0 / 0
02.09.2007, 18:05:37
    #34770348
teras
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DnsValidateName()
Код: 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
02.09.2007, 18:23:34
    #34770356
Tubrik
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
DnsValidateName()
все работает, спасибо

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


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