Форум: "Начинающим";
Текущий архив: 2011.03.27;
Скачать: [xml.tar.bz2];
Внизошибка при компиляции Найти похожие ветки
← →
adminmax © (2010-12-26 07:55) [0]При компилировании выдается ошибка: types of actual and formal var parameters must be identical
procedure TForm1.Button1Click(Sender: TObject);
const
login = "LOG";
pwd = "PWD";
var
ws: DEVINOSoap;
Ballance : Variant;
ComandStatus: CommandStatus;
begin
ws := GetDEVINOSoap();
with ws do
GetCreditBalance(login, pwd, ComandStatus, Ballance);
end;
А вот описание самой процедуры:
procedure GetCreditBalance(const smsUser: WideString; const password: WideString; out GetCreditBalanceResult: CommandStatus; out creditBalance: TXSDecimal); stdcall;
Компилятор ругается вот на эту строку: GetCreditBalance(login, pwd, ComandStatus, Ballance);
Подскажите пожалуйста, что я не так делаю, в чем ошибка?
← →
sniknik © (2010-12-26 10:44) [1]> Ballance : Variant;
> out creditBalance: TXSDecimal
> types of actual and formal var parameters must be identical
← →
Anatoly Podgoretsky © (2010-12-26 11:32) [2]> adminmax (26.12.2010 07:55:00) [0]
В том, что актуальные параметры неиндетичны формальным.
← →
adminmax © (2010-12-27 04:43) [3]Если написать так:
var
Ballance : TXSDecimal;
тогда компилятор выводит ошибку:
Undeclared identifier: "TXSDecimal"
Подскажите, что это за тип и как с ним работать?
← →
MBo © (2010-12-27 05:58) [4]>Подскажите, что это за тип и как с ним работать?
Где функцию взял, там и информацию надо искать
← →
Плохиш © (2010-12-27 12:14) [5]
> Подскажите, что это за тип и как с ним работать?
Взять в веб-сервисах
← →
adminmax © (2010-12-28 04:41) [6]
> Плохиш © (27.12.10 12:14) [5]
>
>
> > Подскажите, что это за тип и как с ним работать?
>
> Взять в веб-сервисах
Что именно взять то нужно? HTTPRIO уже используется
← →
Ega23 © (2010-12-28 08:01) [7]
> Что именно взять то нужно?
Нужно объявить переменную типа TXSDecimal. В неё будет выдан второй их out-параметров процедуры GetCreditBalance.
А что это за тип, где он объявлен, как с ним работать и что там вообще к чему - узнавай у автора процедуры GetCreditBalance
← →
brother © (2010-12-28 08:02) [8]ищи где описан GetCreditBalance и найдешь в каком юните он описан, сдается мне... это простой record...
← →
brother © (2010-12-28 08:03) [9]> и найдешь в каком юните он описан
читать как: и найдешь в каком юните описан TXSDecimal
зы. ега опередил)
← →
brother © (2010-12-28 08:06) [10]по гуглу вот что нашел:
http://delphi.wikia.com/wiki/TXSDecimal_Class
← →
adminmax © (2010-12-28 08:27) [11]Вот текст этого юнита... но описания этого класса там нет :(
// ************************************************************************ //
// The types declared in this file were generated from data read from the
// WSDL File described below:
// WSDL : http://gw1.streamsms.ru/WebService.asmx?wsdl
// Encoding : utf-8
// Version : 1.0
// (25.12.2010 18:15:41 - 1.33.2.5)
// ************************************************************************ //
unit WebService;
interface
uses InvokeRegistry, SOAPHTTPClient, Types, XSBuiltIns;
type
// ************************************************************************ //
// The following types, referred to in the WSDL document are not being represented
// in this file. They are either aliases[@] of other types represented or were referred
// to but never[!] declared in the document. The types from the latter category
// typically map to predefined/known XML or Borland types; however, they could also
// indicate incorrect WSDL documents that failed to declare or import a schema type.
// ************************************************************************ //
// !:string - "http://www.w3.org/2001/XMLSchema"
// !:decimal - "http://www.w3.org/2001/XMLSchema"
// !:boolean - "http://www.w3.org/2001/XMLSchema"
// !:int - "http://www.w3.org/2001/XMLSchema"
// !:dateTime - "http://www.w3.org/2001/XMLSchema"
{ "http://gw1.devinosms.com/WebService.asmx" }
CommandStatus = (
OK_Operation_Completed,
Error_Not_Enough_Credits,
Error_Message_Rejected,
Error_Invalid_Source_Address,
Error_Invalid_Destination_Address,
Error_SMS_User_Disabled,
Error_Invalid_MessageID,
Error_Invalid_Header,
Error_Invalid_Login,
Error_Invalid_Password,
Error_Unauthorised_IP_Address,
Error_Invalid_Activation_Code,
Error_SMS_User_Not_Activated,
Error_Message_Queue_Full,
Error_Gateway_Offline,
Error_Gateway_Busy,
Error_Database_Offline,
Error_No_Messages_Selected,
Error_Outbox_Empty
);
{ "http://gw1.devinosms.com/WebService.asmx" }
MessageState = (
Enqueued,
Sending,
Delivered_To_Gateway,
Sent,
Delivered_To_Recipient,
Error_Invalid_Destination_Address2,
Error_Invalid_Source_Address2,
Error_Incompatible_Destination,
Error_Rejected,
Error_Expired,
Unknown
);
ArrayOfString = array of WideString; { "http://gw1.devinosms.com/WebService.asmx" }
// ************************************************************************ //
// Namespace : http://gw1.devinosms.com/WebService.asmx
// soapAction: http://gw1.devinosms.com/WebService.asmx/%operationName%
// transport : http://schemas.xmlsoap.org/soap/http
// binding : DEVINOSoap
// service : DEVINO
// port : DEVINOSoap
// URL : http://gw1.streamsms.ru/WebService.asmx
// ************************************************************************ //
DEVINOSoap = interface(IInvokable)
["{4B016AD2-4E02-7B0E-4BE6-B469158AB809}"]
procedure GetCreditBalance(const smsUser: String; const password: String; out GetCreditBalanceResult: CommandStatus; out creditBalance: integer); stdcall;
procedure SendTextMessage(const smsUser: WideString; const password: WideString; const destinationAddress: WideString; const messageData: WideString; const sourceAddress: WideString; const deliveryReport: Boolean; const flashMessage: Boolean; const validityPeriod: Integer; out SendTextMessageResult: CommandStatus; out messageId: ArrayOfString
); stdcall;
procedure GetMessageState(const smsUser: WideString; const password: WideString; const messageId: WideString; out GetMessageStateResult: CommandStatus; out reportedDateUtc: TXSDateTime; out messageState: MessageState); stdcall;
procedure SendWapPushSMS(const smsUser: WideString; const password: WideString; const destinationAddress: WideString; const WapUrl: WideString; const DescriptionText: WideString; const sourceAddress: WideString; const deliveryReport: Boolean; out SendWapPushSMSResult: CommandStatus; out messageId: ArrayOfString); stdcall;
procedure GetMessageState2(const smsUser: WideString; const password: WideString; const messageId: WideString; out GetMessageState2Result: CommandStatus; out reportedDateUtc: TXSDateTime; out messageState: MessageState); stdcall;
end;
function GetDEVINOSoap(UseWSDL: Boolean=System.False; Addr: string=""; HTTPRIO: THTTPRIO = nil): DEVINOSoap;
implementation
function GetDEVINOSoap(UseWSDL: Boolean; Addr: string; HTTPRIO: THTTPRIO): DEVINOSoap;
const
defWSDL = "http://gw1.streamsms.ru/WebService.asmx?wsdl";
defURL = "http://gw1.streamsms.ru/WebService.asmx";
defSvc = "DEVINO";
defPrt = "DEVINOSoap";
var
RIO: THTTPRIO;
begin
Result := nil;
if (Addr = "") then
begin
if UseWSDL then
Addr := defWSDL
else
Addr := defURL;
end;
if HTTPRIO = nil then
RIO := THTTPRIO.Create(nil)
else
RIO := HTTPRIO;
try
Result := (RIO as DEVINOSoap);
if UseWSDL then
begin
RIO.WSDLLocation := Addr;
RIO.Service := defSvc;
RIO.Port := defPrt;
end else
RIO.URL := Addr;
finally
if (Result = nil) and (HTTPRIO = nil) then
RIO.Free;
end;
end;
initialization
InvRegistry.RegisterInterface(TypeInfo(DEVINOSoap), "http://gw1.devinosms.com/WebService.asmx", "utf-8");
InvRegistry.RegisterDefaultSOAPAction(TypeInfo(DEVINOSoap), "http://gw1.devinosms.com/WebService.asmx/%operationName%");
RemClassRegistry.RegisterXSInfo(TypeInfo(CommandStatus), "http://gw1.devinosms.com/WebService.asmx", "CommandStatus");
RemClassRegistry.RegisterXSInfo(TypeInfo(MessageState), "http://gw1.devinosms.com/WebService.asmx", "MessageState");
RemClassRegistry.RegisterExternalPropName(TypeInfo(MessageState), "Error_Invalid_Destination_Address2", "Error_Invalid_Destination_Address");
RemClassRegistry.RegisterExternalPropName(TypeInfo(MessageState), "Error_Invalid_Source_Address2", "Error_Invalid_Source_Address");
RemClassRegistry.RegisterXSInfo(TypeInfo(ArrayOfString), "http://gw1.devinosms.com/WebService.asmx", "ArrayOfString");
end.
← →
adminmax © (2010-12-28 08:30) [12]Текст этого юнита был сгенерирован WSDLimporter-ом
← →
Ega23 © (2010-12-28 08:31) [13]
DEVINOSoap = interface(IInvokable)
["{4B016AD2-4E02-7B0E-4BE6-B469158AB809}"]
procedure GetCreditBalance(const smsUser: String; const password: String; out GetCreditBalanceResult: CommandStatus;out creditBalance: integer
); stdcall;
Как тебя понимать, Саид?
← →
brother © (2010-12-28 08:31) [14]> uses InvokeRegistry, SOAPHTTPClient, Types, XSBuiltIns;
думаю, он там
← →
Palladin © (2010-12-28 08:33) [15]понимать его так... очередной "понт" взялся написать крутую "прогу", взаимодействующую с веб-сервисом какой нибудь платежной системы...
← →
sniknik © (2010-12-28 09:34) [16]> думаю, он там
если бы не сообщение выше... а где уверенность, что он там, тот же самый, что в "его" модуле. и то, что "его" модуль на дельфи написан (там это вообще класс).
← →
adminmax © (2010-12-28 09:48) [17]
> Как тебя понимать, Саид?
Просто пока ответа ждал, немного эксперементировал... поменял TXSDecimal на integer
> очередной "понт" взялся написать крутую "прогу", взаимодействующую
> с веб-сервисом какой нибудь платежной системы...
Не совсем "платежной" системы... эта прога для взаимодействия с сервисом www.streamsms.ru для рассылки СМС сообщений
Все мы когда то что то в первый раз делали, поэтому совета и спрашивал, так что, могли бы и без оскорблений!
> думаю, он там
Да. спасибо за подсказку! Он действительно там:
{ TXSDecimal }
{ Rudimentary support (strictly to handle xsd:decimal) for now }
TXSDecimal = class(TRemotableXS)
private
FDecimalString: string;
function GetAsBcd: TBcd;
procedure SetAsBcd(const Value: TBcd);
public
procedure XSToNative(Value: WideString); override;
function NativeToXS: WideString; override;
property DecimalString: string read FDecimalString write FDecimalString;
property AsBcd: TBcd read GetAsBcd write SetAsBcd;
end;
Добавил юнит XSBuiltIns в раздел Uses
Теперь все компилируется нормально.
Но при попытке выполнить процедуру GetCreditBalance программа вылетает с ошибкой:
Debugger Exception Notification
Project Project1.exe raised exception class EAccessVolation with message "Access voilation at address 004036FC in module "Project1.exe". Read of address 0575C060". Process stopped. Use Step or Run to continue.
Подскажите из за чего это может быть?
← →
Ega23 © (2010-12-28 10:20) [18]
> Подскажите из за чего это может быть?creditBalance = nil
← →
Плохиш © (2010-12-28 11:50) [19]
> Подскажите из за чего это может быть?
Вопрос про это исключение задаëтся здесь каждые пару недель.
PS. Нафига оно тебе это программирование?
← →
Плохиш © (2010-12-28 11:59) [20]И вообще, создание клиентов для веб-сервисов подробно описано в руководстве разработчика и справке, поставляеммых с указанной D7.
← →
sniknik © (2010-12-28 14:51) [21]> creditBalance = nil
скорее не инициализировано, но значение есть т.к. переменная локальная, nil в принципе должно понимать (другая ошибка бы была), хотя, как написано конечно.
> Подскажите из за чего это может быть?
еще один вариант писал раньше, типы не равны несмотря на то что одинаково названы... тут инициализация не поможет.
Страницы: 1 вся ветка
Форум: "Начинающим";
Текущий архив: 2011.03.27;
Скачать: [xml.tar.bz2];
Память: 0.52 MB
Время: 0.004 c