|
Вопрос # 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')
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|