Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.01.2010, 22:12   #1
plato
Форумчанин
 
Регистрация: 23.01.2009
Сообщений: 107
По умолчанию Набрать номер по модему. Различие в реализации кода Delphi 2007 и 2010.

Стоит задача «набрать номер по модему».
Использую код, приведенный в Интернете.
Ссылка:

http://www.delphisources.ru/pages/faq/base/tapi.html

Или вот сам код:

Код:
{tapi Errors}
const TAPIERR_CONNECTED = 0;
const TAPIERR_DROPPED = -1;
const TAPIERR_NOREQUESTRECIPIENT = -2;
const TAPIERR_REQUESTQUEUEFULL = -3;
const TAPIERR_INVALDESTADDRESS = -4;
const TAPIERR_INVALWINDOWHANDLE = -5;
const TAPIERR_INVALDEVICECLASS = -6;
const TAPIERR_INVALDEVICEID = -7;
const TAPIERR_DEVICECLASSUNAVAIL = -8;
const TAPIERR_DEVICEIDUNAVAIL = -9;
const TAPIERR_DEVICEINUSE = -10;
const TAPIERR_DESTBUSY = -11;
const TAPIERR_DESTNOANSWER = -12;
const TAPIERR_DESTUNAVAIL = -13;
const TAPIERR_UNKNOWNWINHANDLE = -14;
const TAPIERR_UNKNOWNREQUESTID = -15;
const TAPIERR_REQUESTFAILED = -16;
const TAPIERR_REQUESTCANCELLED = -17;
const TAPIERR_INVALPOINTER = -18;

{tapi size constants}
const TAPIMAXDESTADDRESSSIZE = 80;
const TAPIMAXAPPNAMESIZE = 40;
const TAPIMAXCALLEDPARTYSIZE = 40;
const TAPIMAXCOMMENTSIZE = 80;
const TAPIMAXDEVICECLASSSIZE = 40;
const TAPIMAXDEVICEIDSIZE = 40;

function tapiRequestMakeCallA(DestAddress : PAnsiChar;
AppName : PAnsiChar;
CalledParty : PAnsiChar;
Comment : PAnsiChar) : LongInt;
stdcall; external 'TAPI32.DLL';

function tapiRequestMakeCallW(DestAddress : PWideChar;
AppName : PWideChar;
CalledParty : PWideChar;
Comment : PWideChar) : LongInt;
stdcall; external 'TAPI32.DLL';

function tapiRequestMakeCall(DestAddress : PChar;
AppName : PChar;
CalledParty : PChar;
Comment : PChar) : LongInt;
stdcall; external 'TAPI32.DLL';



Нажатие кнопки обработайте следующим образом: 
procedure TForm1.Button1Click(Sender: TObject);
var
  DestAddress : string;
  CalledParty : string;
  Comment : string;
begin
  DestAddress := '000-00-00'; {phone number}
  CalledParty := '___Nikolay';
  Comment := 'Calling to ___Nikolay';
  tapiRequestMakeCall(pChar(DestAddress),
  PChar(Application.Title),
  pChar(CalledParty),
  PChar(Comment));
end;
Под Delphi 2007 все работает нормально. Вызов идет, звонок можно нормально совершить.
Если тот же самый код использовать в Delphi 2010, то здесь траблы. Неверно передается номер телефона. Передает только первую цифру.
Может там проблема с типами данных?
и не забудьте подарить детям шоколадку
plato вне форума Ответить с цитированием
Старый 24.01.2010, 22:48   #2
Kotofff
Участник клуба
 
Аватар для Kotofff
 
Регистрация: 11.01.2009
Сообщений: 1,917
По умолчанию

В самой функции попробуй вместо PChar использовать PAnsiChar. Т.е.
Код:
procedure TForm1.Button1Click(Sender: TObject);
var
  DestAddress : string;
  CalledParty : string;
  Comment : string;
begin
  DestAddress := '000-00-00';
  CalledParty := '___Nikolay';
  Comment := 'Calling to ___Nikolay';
  tapiRequestMakeCall(PAnsiChar(DestAddress), PAnsiChar(Application.Title), PAnsiChar(CalledParty), PAnsiChar(Comment));
end;
Как-то помогло при переводе проекта на D2010.
"Заряженному танку в дуло не смотрят" @Dekmer in WoT

Последний раз редактировалось Kotofff; 24.01.2010 в 22:51.
Kotofff вне форума Ответить с цитированием
Старый 25.01.2010, 10:30   #3
plato
Форумчанин
 
Регистрация: 23.01.2009
Сообщений: 107
По умолчанию

Спасибо за подсказку. Это помогло. 5 минут страданий, и решение найдено. Только нужно было сделать в другом варианте. Сама функция tapiRequestMakeCall ругается на смену типов. Там все надо оставить как есть. А переменную DestAddress как раз объявить как PAnsiChar. Тогда все работает.

По сути вопрос закрыт.
Но если появятся дополнительные интересные мысли по поводу различий 2007 и 2010 с конкретными примерами, то интересно было бы посмотреть.
и не забудьте подарить детям шоколадку

Последний раз редактировалось Stilet; 04.03.2010 в 09:27.
plato вне форума Ответить с цитированием
Старый 03.03.2010, 21:02   #4
Qami
Пользователь
 
Регистрация: 15.02.2010
Сообщений: 11
По умолчанию

Звонки можно совершать на домашние и мобильные телефоны любых опсосов ?
Qami вне форума Ответить с цитированием
Старый 03.03.2010, 21:09   #5
Grenade
Пользователь
 
Аватар для Grenade
 
Регистрация: 03.03.2010
Сообщений: 38
По умолчанию

Да, это конечно плохо для нас , программистов , что языки разные, но к сожелению это так. Мне нечего добывить. Всё вышесказанное верно, встречался с точно такой же проблемой... Ведь 2007 Delphi - это Borland, а 2010 - это Embarcadero....
Grenade вне форума Ответить с цитированием
Старый 03.03.2010, 21:28   #6
FaTaL
Участник клуба
 
Аватар для FaTaL
 
Регистрация: 09.11.2007
Сообщений: 1,761
По умолчанию

Да совсем не в этом дело борланд это или другое что. Дело в том что в дельфине 2009 - 2010 по умолчанию типа String это набор Unicode символов, т.е. двухбайтовых. Вот в этом всё и дело.
FaTaL вне форума Ответить с цитированием
Старый 03.03.2010, 21:28   #7
plato
Форумчанин
 
Регистрация: 23.01.2009
Сообщений: 107
По умолчанию

Правоприемник должен был позаботиться о наиболее безболезненном переходе.
и не забудьте подарить детям шоколадку
plato вне форума Ответить с цитированием
Старый 04.04.2010, 16:27   #8
alf138
Новичок
Джуниор
 
Регистрация: 02.04.2010
Сообщений: 1
По умолчанию

Господа можно выложить весь текст а то у меня не получается
мне нужно строчку
Код:
  DestAddress:= PAnsiChar(Edit1.Text);
alf138 вне форума Ответить с цитированием
Старый 06.04.2010, 09:47   #9
plato
Форумчанин
 
Регистрация: 23.01.2009
Сообщений: 107
По умолчанию

Код:
var
DestAddress : AnsiString;
...
...
...
DestAddress:= Edit1.Text;
DialExecute(Sender);
...
...
...
procedure TForm1.DialExecute(Sender: TObject);
begin
  if MessageDlg(
    'Звоним на номер ' + DestAddress + '?',
    mtConfirmation,
    [mbOk, mbCancel],
    0) = mrOk
      then
        tapiRequestMakeCall(
          PChar(DestAddress),
          PChar(Application.Title),
          pChar(CalledParty),
          PChar(Comment));
end;
...
...
...
и не забудьте подарить детям шоколадку
plato вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Различие MD5 Delphi и MD5 PHP Viteef Общие вопросы Delphi 14 09.02.2011 11:53
Не вставить рисунок в Word 2007-2010 Tongo Microsoft Office Word 0 05.01.2010 20:24
"конвертиция" кода (delphi 2007-->delphi 7) sdp Софт 7 21.06.2007 21:19
Delphi 2007 for Win32 + Delphi 2007 for PHP Noor Софт 0 20.04.2007 08:36