| 
| 
 | Вопрос # 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 (статус: Посетитель)Вопрос отправлен: 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 (статус: Посетитель), 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 (статус: Посетитель), 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 (статус: Посетитель), 30 января 2009, 23:52 [#6]:WindowsXP SP3 |  
|   | Паровоз (статус: 10-ый класс), 31 января 2009, 09:28 [#7]:У Вас неправильно обрабатывется директива условной компиляции версии Windows.  Попробуйте в самом начале файла заменить {.$DEFINE WINVER41} на {$DEFINE WINVER41} |  
|   | Zlodey (статус: Посетитель), 31 января 2009, 10:02 [#8]:Спасибо, замена помогла. Теперь другой вопрос вылез delphi 2009 как то не правильно посылает команды в com порт. Ну это надо разбираться. |  
|   | 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 (статус: Посетитель), 31 января 2009, 11:00 [#11]:точно проблемма в кодировке. приходит ответ от модема ввиде квадртов. Подскажи где переключить кодировку! |  
|   | Паровоз (статус: 10-ый класс), 31 января 2009, 11:25 [#12]:А Вы пробовали заменть PChar на PAnsiChar? |  
|   | Вадим К (статус: Академик), 31 января 2009, 16:41 [#13]:Проблема не в кодировке, а головах. Если внимательно читали, что  я писал о Делфи 2009, то должны были бы обратить внимание, что там теперь все строки ЮНИКОДНЫЕ! и те точки - это не пробелы, это нули. В юникоде один символ занимает 2 байта.  Для того, что бы работал старый код, надо использовать Ansi строки. так как написал Паровоз. Галочка "подтверждения прочтения" - вселенское зло. |  
|   | Zlodey (статус: Посетитель), 31 января 2009, 19:13 [#14]:Переделать нужно только функции чтения записи ? Как я понимаю Обмен с модемом идет в кодировке Ansi. т.е. мне нужно записывать и читать команды в ansi в потом конвертировать в unicode и работать уже с unicode'ом.  Правильно ли я рассуждаю? Можно сделать что бы по умолчанию была Ansi?
 Как называется функция для конвертации кодировки  из Ansi to Unicode?
 
 Вадим К можете дать ссылку где вы писали о Delphi 2009.
 Сильно не ругайтесь, так как я начинающий программист.
 |  
|   | 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 (статус: Посетитель), 1 февраля 2009, 10:47 [#18]:Извените. Проблемму решил! RasSetEntryPropertiesA (nil, PAnsiChar('ModemZTE')
 |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |