Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 2 366

/ вопрос открыт /

Здравствуйте!
Я использую компонент Ras.pas для работы с DiaUp
При компиляции проекта выдает ошибку

[DCC Error] Ras.pas(2237): E2267 Previous declaration of 'RasValidateEntryName' was not marked with the 'overload' directive

Code:
function RasValidateEntryName(lpszPhonebook, szEntry: PAnsiChar): Longint;
var
f: Function(lpszPhonebook, szEntry: PAnsiChar): Longint; stdcall;
begin
@f := rnaph_('RasValidateEntryName');
Result := f(lpszPhonebook, szEntry);
end;

[DCC Error] Ras.pas(1117): E2065 Unsatisfied forward or external declaration: 'RasGetEntryProperties'

Code:
function RasGetEntryProperties(
lpszPhonebook,
szEntry: PChar;
lpbEntry: Pointer;
var lpdwEntrySize: Longint;
lpbDeviceInfo: Pointer;
var lpdwDeviceInfoSize: Longint
): Longint; stdcall;

Ошибка стала появляться после того как перешёл на Delphi 2009 Перед этим стоял Delphi 2007 все было хорошо.

Zlodey Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задал: Zlodey (статус: Посетитель)
Вопрос отправлен: 29 января 2009, 20:41
Состояние вопроса: открыт, ответов: 2.

Ответ #1. Отвечает эксперт: Паровоз

Здравствуйте, Zlodey!
Видимо, Вы внесли случайно изменения в модуль Ras.
1) 'RasValidateEntryName' эта функция экспортируется из rasapi32.dll и не может быть объявлена иначе как stdcall, что отсутствет в Вашем объявлении. Компилятор сообщает, что в модуле присутствует еще одно объявление этой функции (видимо, правильное - с stdcall).
2) 'RasGetEntryProperties' нет в rasapi32.dll. Вместо них есть две функции RasGetEntryPropertiesA и RasGetEntryPropertiesW, а RasGetEntryProperties должна в зависимость от условий компиляции быть объявлена совпадающей с одной из них. Компилятор сообщает, что этого объявления нет. Возможно Вы закомментировали это объявление.

Ответ отправил: Паровоз (статус: 10-ый класс)
Время отправки: 30 января 2009, 00:10

Ответ #2. Отвечает эксперт: Вадим К

Здравствуйте, Zlodey!
Первая ошибка похожа на то, что уже есть где то объявлена функция с таким же именем RasValidateEntryName, но только немного отличается в параметрах. Возможно, что разработчики добавили её в какой то юнит, который подключен в uses. Надо искать. Хотя часто решается очень просто - просто надо переименовать эту функцию, например добавить подчеркивание в начало. Ну и соответственно все вызовы.
Вторая ошибка более весёлая. Есть такая штука, как предварительное объявление функции. То есть, вначале пишется только заголовок функции, что бы компилятор знал, как её вызвать, а где то ниже сама функция. Эта ошибка говорит о том, что объявление есть, а самой функции - нет. Если раньше всё компилировалось, а теперь нет, то есть только два объяснения.
а) функция объявлена в obj файле. и сам файл должен быть подключен. Но по каким то причинам его нет. или файл obj был удалён... маловероятно.
б) реализация функции заключена в директивы условной компиляции. Так как есть только директива-проверка на соответствие версии, но нет на "старше/младше" заданной версии и о 2009 делфи этот юнит наверно ни сном, ни духом и получилось, что эти директивы и исключила функцию. Как лечить - ищем реализацию этой функции и вокруг неё директивы в стиле {$IFDEF ....} {$ENDIF}. Как минимум можно просто удалить. Либо добавить новых, что бы новую версию.

Ответ отправил: Вадим К (статус: Академик)
Время отправки: 30 января 2009, 00:10


Мини-форум вопроса

Всего сообщений: 18; последнее сообщение — 1 февраля 2009, 10:47; участников в обсуждении: 3.
Zlodey

Zlodey (статус: Посетитель), 30 января 2009, 18:16 [#1]:

Спасибо за ответы! Посмотрите файл RAS.pas http://slil.ru/26599994
Может вам будет более понятно, в чем пробела. Если не сложно исправьте и выложите исправленный файл. А то боюсь сам сейчас как на исправляю что вообще работать нечего не будет.
Паровоз

Паровоз (статус: 10-ый класс), 30 января 2009, 18:39 [#2]:

Посмотрел ваш файл. На Delphi 7 компилируется без ошибок. То, что вы привели в своем сообщении не соответствует содержимому переданного на форум файла.
Вадим К

Вадим К (статус: Академик), 30 января 2009, 18:59 [#3]:

Взял домой, попробую собрать.
Галочка "подтверждения прочтения" - вселенское зло.
Zlodey

Zlodey (статус: Посетитель), 30 января 2009, 19:17 [#4]:

Не совсем правильно написал ошибки
[DCC Error] Ras.pas(2237): E2267 Previous declaration of 'RasValidateEntryName' was not marked with the 'overload' directive
[DCC Error] Ras.pas(2245): E2267 Previous declaration of 'RasRenameEntry' was not marked with the 'overload' directive
[DCC Error] Ras.pas(2253): E2267 Previous declaration of 'RasDeleteEntry' was not marked with the 'overload' directive
[DCC Error] Ras.pas(2263): E2267 Previous declaration of 'RasGetEntryProperties' was not marked with the 'overload' directive
[DCC Error] Ras.pas(2275): E2267 Previous declaration of 'RasSetEntryProperties' was not marked with the 'overload' directive
[DCC Error] Ras.pas(1117): E2065 Unsatisfied forward or external declaration: 'RasGetEntryProperties'
[DCC Error] Ras.pas(1142): E2065 Unsatisfied forward or external declaration: 'RasSetEntryProperties'
[DCC Error] Ras.pas(1158): E2065 Unsatisfied forward or external declaration: 'RasRenameEntry'
[DCC Error] Ras.pas(1171): E2065 Unsatisfied forward or external declaration: 'RasDeleteEntry'
[DCC Error] Ras.pas(1184): E2065 Unsatisfied forward or external declaration: 'RasValidateEntryName'
_______________________________
1. ошибка по RasDeleteEntry

function RasDeleteEntry(lpszPhonebook, szEntry: PAnsiChar): Longint;
var
f: function(lpszPhonebook, szEntry: PAnsiChar): Longint; stdcall;
begin
@f := rnaph_('RasDeleteEntry');
Result := f(lpszPhonebook, szEntry);
end;
__________________________________
2. ошибка по RasDeleteEntry

function RasDeleteEntry(
lpszPhonebook,
szEntry: PChar
): Longint; stdcall;
Паровоз

Паровоз (статус: 10-ый класс), 30 января 2009, 23:23 [#5]:

Под какой Windows Вы работаете?
Zlodey

Zlodey (статус: Посетитель), 30 января 2009, 23:52 [#6]:

WindowsXP SP3
Паровоз

Паровоз (статус: 10-ый класс), 31 января 2009, 09:28 [#7]:

У Вас неправильно обрабатывется директива условной компиляции версии Windows. Попробуйте в самом начале файла заменить {.$DEFINE WINVER41} на {$DEFINE WINVER41}
Zlodey

Zlodey (статус: Посетитель), 31 января 2009, 10:02 [#8]:

Спасибо, замена помогла. Теперь другой вопрос вылез delphi 2009 как то не правильно посылает команды в com порт. Ну это надо разбираться.
Zlodey

Zlodey (статус: Посетитель), 31 января 2009, 10:35 [#9]:

посылаю команду в com порт at+cgsn
снифером (portmon) отбражается что послал a.t.+.c.g.s.n.
как я понимаю "." это пробел
В чем проблема?

function Write (ATWrite :string):boolean; //Запись AT команд
var
NumberWritten : cardinal;

begin
if WriteFile(hport,
PChar(ATWRite+ #13 + #10)^,
Length(ATWRite+ #13 + #10),
NumberWritten,
nil) = false then
begin
// ShowMessage('Не удалось записать команду ' + ATWRite);
end;
end;

Все проблеммы начили появляться при переходе на delphi 2009
Паровоз

Паровоз (статус: 10-ый класс), 31 января 2009, 10:41 [#10]:

Вообще то, это тема другого вопроса. А так, необходимо учитывать, что по умолчанию Delphi 2009 работает с юникодом и PChar это не PAnsiChar, а PWideChar и т.д.
Zlodey

Zlodey (статус: Посетитель), 31 января 2009, 11:00 [#11]:

точно проблемма в кодировке. приходит ответ от модема ввиде квадртов. Подскажи где переключить кодировку!
Паровоз

Паровоз (статус: 10-ый класс), 31 января 2009, 11:25 [#12]:

А Вы пробовали заменть PChar на PAnsiChar?
Вадим К

Вадим К (статус: Академик), 31 января 2009, 16:41 [#13]:

Проблема не в кодировке, а головах. Если внимательно читали, что я писал о Делфи 2009, то должны были бы обратить внимание, что там теперь все строки ЮНИКОДНЫЕ! и те точки - это не пробелы, это нули. В юникоде один символ занимает 2 байта. Для того, что бы работал старый код, надо использовать Ansi строки. так как написал Паровоз.
Галочка "подтверждения прочтения" - вселенское зло.
Zlodey

Zlodey (статус: Посетитель), 31 января 2009, 19:13 [#14]:

Переделать нужно только функции чтения записи ? Как я понимаю Обмен с модемом идет в кодировке Ansi. т.е. мне нужно записывать и читать команды в ansi в потом конвертировать в unicode и работать уже с unicode'ом. Правильно ли я рассуждаю?
Можно сделать что бы по умолчанию была Ansi?
Как называется функция для конвертации кодировки из Ansi to Unicode?

Вадим К можете дать ссылку где вы писали о Delphi 2009.
Сильно не ругайтесь, так как я начинающий программист.
Zlodey

Zlodey (статус: Посетитель), 31 января 2009, 19:27 [#15]:

еще проблемма вылезла
Есть у меня процедура создания Dial Up соединение
procedure Creat;
var
entry: TRasEntry;
begin
FillChar(entry, SizeOf(TRasEntry), 0);
entry.dwSize := SizeOf(TRasEntry);

StrPCopy(entry.szLocalPhoneNumber, '*99#');
StrPCopy(entry.szDeviceName, 'ZTE Proprietary USB Modem');
StrPCopy(entry.szDeviceType, 'modem');
entry.dwfOptions := RASEO_ModemLights; // вывести значек подключения

RasSetEntryProperties(nil, PChar('ModemZTE'),@entry, SizeOf(TRasEntry), nil, 0);
end;

Создаёт соединение с именем M, а не ModemZTE'. Тут еще в чем проблемма?
Паровоз

Паровоз (статус: 10-ый класс), 31 января 2009, 23:41 [#16]:

"в чем проблема? "
Проблема в том, что начинающий программист должен работать не в Delphi 2009, а в Delphi 7. Иначе цепочка Ваших вопросов будет бесконечной.
Паровоз

Паровоз (статус: 10-ый класс), 1 февраля 2009, 09:37 [#17]:

Уважаемый Zlodey (вот, видите, у нас на форуме и злодеи являются уважаемыми). Вы проявлете неуважение к другим участникам форума. Обычным процессом является просмотр вопросов в поисках нужной информации и если такая информация найдена, то тогда просматривают ответ. Поэтому на большинстве форумов принято вопрос по новой теме задавать в новой ветке. Вопрос, который Вы задали исчерпан. Вам кто-то мешает открыть новую ветку своим новым вопросом?

P.S. Вам уже объяснили, что PChar Delphi2009 - это юникодный тип. Тем не менее Вы с завидным упорством продолжаете использовать его в своих конструкциях вместо PAnsiChar (PChar('ModemZTE')). Так почему Вас удивляют очередные ошибки?
Zlodey

Zlodey (статус: Посетитель), 1 февраля 2009, 10:47 [#18]:

Извените. Проблемму решил!
RasSetEntryPropertiesA (nil, PAnsiChar('ModemZTE')

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:54
Выполнено за 0.03 сек.