PDA

View Full Version : define new type



sina1370
پنج شنبه 10 تیر 1389, 10:51 صبح
سلام من یه تابع دارم که آرایه ای از object ها رو بر میگردونه البته با WSDl importer فایل type ها رو import ولی یه نوع جدید وجود داره که دلفی اونو تشخیص نمیده و از نوع variant تعریف کرده بعد تویه راهنمای وب سرویس گفته این تابع آرایه ای از object ها برمیگردونه که فرمتشو باید کاربر پیدا کنه و استفاده کنه اولا این unit ایمپورت شده است :



unit SOAPSmsQueue;

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"
// !:int - "http://www.w3.org/2001/XMLSchema"
// !:long - "http://www.w3.org/2001/XMLSchema"
**** // !:anyType - "http://www.w3.org/2001/XMLSchema"
// !:float - "http://www.w3.org/2001/XMLSchema"


ArrayOf_xsd_string = array of WideString;
ArrayOf_xsd_int = array of Integer;
ArrayOf_xsd_long = array of Int64;
*** ArrayOf_xsd_anyType = array of variant;

// ************************************************** ********************** //
// Namespace : http://xxxx.com/soap/SOAPSmsQueue
// transport : http://schemas.xmlsoap.org/soap/http
// style : rpc
// binding : TSOAPSoapBinding
// service : SoapSmsQueuableImplementationService
// port : TSOAP
// URL : http://webservice.xxxx.com/services/urn:SOAPSmsQueue
// ************************************************** ********************** //

SoapSmsQueuableImplementation = interface(IInvokable)
['{9DBBFB75-511D-1D3D-5200-4133705D96F5}']
function enqueue(const domain: WideString; const messageBodies: ArrayOf_xsd_string; const recipientNumbers: ArrayOf_xsd_string; const senderNumbers: ArrayOf_xsd_string; const encodings: ArrayOf_xsd_int; const udhs: ArrayOf_xsd_string; const messageClasses: ArrayOf_xsd_int; const priorities: ArrayOf_xsd_int; const checkingMessageIds: ArrayOf_xsd_long): ArrayOf_xsd_long; stdcall;
function getMessageId(const domain: WideString; const checkingMessageId: Int64): Int64; stdcall;
function getRealMessageStatuses(const messagesId: ArrayOf_xsd_long): ArrayOf_xsd_int; stdcall;
*** function getAllMessagesWithNumber(const domain: WideString; const numberOfMessages: Integer; const destNumber: WideString): ArrayOf_xsd_anyType; stdcall;
function getCredit(const domain: WideString): Single; stdcall;
*** function getAllMessages(const domain: WideString; const numberOfMessages: Integer): ArrayOf_xsd_anyType; stdcall;
function enqueueWithGateway(const domain: WideString; const messageBodies: ArrayOf_xsd_string; const recipientNumbers: ArrayOf_xsd_string; const senderNumbers: ArrayOf_xsd_string; const encodings: ArrayOf_xsd_int; const udhs: ArrayOf_xsd_string; const messageClasses: ArrayOf_xsd_int; const priorities: ArrayOf_xsd_int; const checkingMessageIds: ArrayOf_xsd_long; const gateway: WideString
): ArrayOf_xsd_long; stdcall;
function getMessageStatuses(const messagesId: ArrayOf_xsd_long): ArrayOf_xsd_int; stdcall;
function getMessageStatus(const messageId: Int64): Integer; stdcall;
end;

function GetSoapSmsQueuableImplementation(UseWSDL: Boolean=System.False; Addr: string=''; HTTPRIO: THTTPRIO = nil): SoapSmsQueuableImplementation;


implementation

function GetSoapSmsQueuableImplementation(UseWSDL: Boolean; Addr: string; HTTPRIO: THTTPRIO): SoapSmsQueuableImplementation;
const
defWSDL = 'http://webservice.xxxx.com/services/urn:SOAPSmsQueue?wsdl'; //argument sent to this wsdl url
defURL = 'http://webservice.xxxx.com/services/urn:SOAPSmsQueue';
defSvc = 'SoapSmsQueuableImplementationService';
defPrt = 'TSOAP';
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 SoapSmsQueuableImplementation);
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(SoapSmsQueu ableImplementation), 'http://xxxx.com/soap/SOAPSmsQueue', 'UTF-8');
InvRegistry.RegisterDefaultSOAPAction(TypeInfo(Soa pSmsQueuableImplementation), '');
RemClassRegistry.RegisterXSInfo(TypeInfo(ArrayOf_x sd_anyType), 'http://xxxx.com/soap/SOAPSmsQueue', 'ArrayOf_xsd_anyType');
RemClassRegistry.RegisterXSInfo(TypeInfo(ArrayOf_x sd_string), 'http://xxxx.com/soap/SOAPSmsQueue', 'ArrayOf_xsd_string');
RemClassRegistry.RegisterXSInfo(TypeInfo(ArrayOf_x sd_int), 'http://xxxx.com/soap/SOAPSmsQueue', 'ArrayOf_xsd_int');
RemClassRegistry.RegisterXSInfo(TypeInfo(ArrayOf_x sd_long), 'http://xxxx.com/soap/SOAPSmsQueue', 'ArrayOf_xsd_long');
RemClassRegistry.RegisterXSInfo(TypeInfo(ArrayOf_x sd_anyType), 'http://xxxx.com/soap/SOAPSmsQueue', 'ArrayOf_xsd_anyType');
end.

مشکل من تو اون قسمت های * دار هستش یعنی من باید به جای

ArrayOf_xsd_anyType = array of variant;


یه نوع جدید تعریف کنم مثلا :

ArrayOf_xsd_anyType = array of incomingFormat;


ضمنا فرمت این آبجکت هم توی XML Response به این صورته :


<multiRef id="id1" soapenc:root="0" soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xsi:type="ns3:CustomerReturnIncomingFormat" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns3="urn:SOAPSmsQueue">
<body xsi:type="xsd:string">0</body>
<errorResult xsi:type="xsd:string" xsi:nil="true"/>
<recipientNumber xsi:type="xsd:string">98300097500072</recipientNumber>
<senderNumber xsi:type="xsd:string">989187082367</senderNumber>
</multiRef>

یعنی 4 تا فیلد از نوع رشته ای برمیگردونه یه توضیح هم اینکه این تابع من که اسمش getAllMessages هست پیامک های دریافتی جدید رو تو یه آرایه از آبجکت با فرمت بالا برمیگردونه


body :widestring;
errorResult :widestring;
recipientNumber:widestring;
senderNumber :widestring;

حالا من باید این نوع جدید رو چه جوری تعریف کنم که وقتی اینجوری مینوسم خطا نگیره ::



ArrayOf_xsd_anyType = array of IncomingFormat;

var
a: ArrayOf_xsd_anyType ;
begin
a := SoapHttp1.getAllmessages('xxxx',1);


یعنی من incomingFormat رو چجوری تعریف کنم؟؟؟؟؟؟؟
لطفا کمک کنید!!

vcldeveloper
پنج شنبه 10 تیر 1389, 14:53 عصر
این تابع geAllMessages آیا فقط یک آیتم (شامل سه فیلد errorNumber, RecipientName, SenderName) برمیگردونه، یا اینکه آرایه ایی از آیتم هایی را برمیگردونه که هر کدام این سه فیلد را دارند؟

اگر فقط یک آیتم برگشت داده میشه که سه فیلد string داره، میشه خیلی راحت روی عناصر آرایه حرکت کرد، و هر عنصر Variant را به عنوان یک string خواند:


var
Element : Variant;
Res := ArrayOf_xsd_anyType;
begin
for Elemenet in Res do
ShowMessage(Elemenet);
end;

اما اگر اون آرایه، آرایه ایی از عناصری هست که هر کدام خودشان اشیائی هستند که اون سه فیلد را دارند، اون وقت کار سختر میشه. قاعدتا باید WSDL Importer اون ساختار داده را به صورت یک Complex type در نظر می گرفت، و یک کلاس مشتق شده از TRemotable، حاوی سه خصوصیت مورد نظر تعریف می کرد، و آرایه از نوع آن کلاس تعریف می شد.

از چه نسخه ایی از دلفی استفاده می کنید؟ فایل کامل WSDL رو می تونید اینجا قرار بدید؟

sina1370
پنج شنبه 10 تیر 1389, 16:01 عصر
ضمن عرض تشکر از توجهتون....
از دلفی 7 و WSDL importer خودش استفاده میکنم.


ما اگر اون آرایه، آرایه ایی از عناصری هست که هر کدام خودشان اشیائی هستند که اون سه فیلد را دارند، اون وقت کار سختر میشه. قاعدتا باید WSDL Importer اون ساختار داده را به صورت یک Complex type در نظر می گرفت، و یک کلاس مشتق شده از TRemotable، حاوی سه خصوصیت مورد نظر تعریف می کرد، و آرایه از نوع آن کلاس تعریف می شد.درسته همون طور که گفتم تابع geAllMessages یه آرایه از آبجکتهارو برمیگردونه مثلا ممکنه 10 تا پیام جدید داشته باشیم که بخوایم دریافتشون کنیم میتونم دومین پارامتر تابع رو که عدد صحیح است 10 بدیم ولی چون نمیدونیم ممکنه چند تا پیام یا اس ام اس جدید داشته باشیم هر بار با 1 این تابع رو صدا میزنیم بعد یا میزاریم تو while یا با timer پیامهای جدید رو دریافت میکنیم حالا اگه اینجوری صدا بزنیم یه آرایه ازهمون نوعی که بالا تو Xml response میبینید برمیگردونه حالا چه یه پیام بگیریم با پارامتر numberOfMessages=1 یه آرایه 1 عنصری برمیگردونه یا اگر با پارامتر numberOfMessages=10
صدا بزنیم یه آرایه 10 عنصری از نوعی که گفتم برمیگردونه و مشکل منم
سر همینه که باید ComplexType رو چطوری تعریف کنم؟؟؟

پس چرا این ساختارو به صورت variant یا array of variant گرفته؟؟؟؟؟؟؟


با اون TRemotable که گفتی دیروز نوشتم یعنی این کار میکنه ::


IncomingFormat = class(TRemotable)

private
S_Body : WideString;
S_ErrorResult : WideString;
S_RecipientNumber : WideString;
S_SenderNumber : WideString;

published
property body : WideString
read S_Body;
property errorResult : WideString
read S_ErrorResult;
property recipientNumber : WideString
read S_RecipientNumber;
property senderNumber : WideString
read S_SenderNumber;
end;

ArrayOf_xsd_anyType = array of IncomingFormat;

راستش من دلفی زیاد کار نکردم نحوه تعریف این رو هم از DelphiGroup پیدا کردم!!!
فایل WSDl مگفا رو هم که گفتی attach کردم...

vcldeveloper
پنج شنبه 10 تیر 1389, 20:03 عصر
پس چرا این ساختارو به صورت variant یا array of variant گرفته؟
خب، با این WSDL، مشکل از دلفی نیست. در WSDL یک نوع xsd:anyType داریم، که در سند توضیح WSDL فقط یک بار بهش اشاره شده. توضیحی هم که درباره اش داده شده، این هست:

Use the xsd:anyType type to represent a field/parameter which can have any type.

xsd:anyType تعریف مشخصی نداره، و هر زبان برنامه نویسی ممکنه اون رو به شکل خاصی پیاده سازی کنه. در سند WSDL شما، اون ساختار سه فیلدی که کد خطا، نام فرستنده، و نام گیرنده را در بر میگیره، تعریف نشده، و آرایه ایی هم که در WSDL تعریف شده، آرایه ایی از xsd:anyType هست. مقدار خروجی تابع GetAllmessages هم همین نوع آرایه هست. یعنی در داخل WSDL اشاره ایی نشده که این داده ایی که به صورت anyType تعریف شده، واقعا ساختارش و محتواش چی هست. پس دلفی هیچ اطلاعی از ساختار این داده نداره. عمومی ترین حالتی که دلفی میتونه برای یک داده با هر نوعی (any type) در نظر بگیره، Variant هست. برای همین هم اون رو به صورت array of variant تعریف کرده، که درست هست.

اگر ساختار داده مربوطه در WSDL شما تعریف شده بود، ولی دلفی آن را خودش بدون توجه به اون تعریف، تبدیل به array of variant می کرد، اون وقت اشتباه از دلفی بود، ولی اینجا در خودِ WSDL شما هم چیزی ذکر نشده.

معمولا توصیه میشه که از نوع xsd:anyType استفاده نشه، چون استفاده از آن مستلزم این هست که به برنامه نویس، جدای از تعاریف WSDL، گفته بشه که باید با این داده به چه شکلی برخورد کنه، چون از روی خود WSDL با این تعریف نمیشه این مسئله رو متوجه شد.

یک احتمال که من میدم این هست که این داده برگشتی خودش یک سند XML باشه، و برای همین به صورت xsd:anyType تعریف شده. این رو میشه با بررسی SOAP Message دریافتی حاصل از فراخوانی آن تابع بررسی کرد، و دید که با فراخوانی آن تابع، دقیقا چه داده ایی از سرور به کلاینت ارسال میشه. اگر داده دریافتی XML باشه، می تونید با کدی مشابه کدی که در پست قبلی قرار دادم، محتوای آن را به صورت آرایه ایی از string بخونید، و همه محتوا را به صورت یک string که حاوی یک سند XML هست، در بیارید، و سپس اون XML را Parse کنید.
اگر XML نیست، ببینید شرکت ارائه کننده سرویس چه توضیحی درباره خروجی این تابع داده، یا اگر مثالی از چگونگی استفاده از آن در سیار زبان ها ارائه کرده، در کد آن زبان ها، با این داده ناشناخته چطور برخورد شده، شما هم همان رفتار را در دلفی پیاده سازی کنید.

sina1370
پنج شنبه 10 تیر 1389, 21:22 عصر
این یه نمونه از XML Soap Response که گفتی تویه php :




*****ًٍREQUEST

POST /services/urn:SOAPSmsQueue HTTP/1.0
Host: webservice.magfa.com
User-Agent: NuSOAP/0.7.1 (1.1)
Content-Type: text/xml; charset=UTF-8
SOAPAction: ""
Authorization: Basic "SENSORED by sina"
Content-Length: 632

<?xml version="1.0" encoding="UTF-8"?>
<SOAP-ENV:Envelope SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" xmlns:impl="http://magfa.com/soap/SOAPSmsQueue">
<SOAP-ENV:Body>
<impl:getAllMessages xmlns:impl="http://magfa.com/soap/SOAPSmsQueue">
<domain xsi:type="xsd:string">magfa</domain>
<numberOfMessages xsi:type="xsd:int">2</numberOfMessages>
</impl:getAllMessages>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>


*****Response
HTTP/1.1 200 OK
Date: Mon, 14 Jun 2010 16:09:14 GMT
Server: Apache-Coyote/1.1
Content-Type: text/xml;charset=utf-8
Via: 1.0 sms.magfa.com
Connection: close

<?xml version="1.0" encoding="UTF-8"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<soapenv:Body>
<ns1:getAllMessagesResponse soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns1="http://magfa.com/soap/SOAPSmsQueue">
<ns1:getAllMessagesReturn xsi:type="soapenc:Array" soapenc:arrayType="ns2:CustomerReturnIncomingFormat[2]" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns2="urn:SOAPSmsQueue">
<item href="#id0"/>
<item href="#id1"/>
</ns1:getAllMessagesReturn>
</ns1:getAllMessagesResponse>
<multiRef id="id1" soapenc:root="0" soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xsi:type="ns3:CustomerReturnIncomingFormat" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/" xmlns:ns3="urn:SOAPSmsQueue">
<body xsi:type="xsd:string">0</body>
<errorResult xsi:type="xsd:string" xsi:nil="true"/>
<recipientNumber xsi:type="xsd:string">98300097500072</recipientNumber>
<senderNumber xsi:type="xsd:string">989187082367</senderNumber>
</multiRef>
<multiRef id="id0" soapenc:root="0" soapenv:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/" xsi:type="ns4:CustomerReturnIncomingFormat" xmlns:ns4="urn:SOAPSmsQueue" xmlns:soapenc="http://schemas.xmlsoap.org/soap/encoding/">
<body xsi:type="xsd:string">0</body>
<errorResult xsi:type="xsd:string" xsi:nil="true"/>
<recipientNumber xsi:type="xsd:string">98300097500072</recipientNumber>
<senderNumber xsi:type="xsd:string">989187082367</senderNumber>
</multiRef>
</soapenv:Body>
</soapenv:Envelope>Result

Array
(
[0] => Array
(
[0] => Array
(
[body] => 0
[errorResult] =>
[recipientNumber] => 98300097500072
[senderNumber] => 989187082367
)

[1] => Array
(
[body] => 0
[errorResult] =>
[recipientNumber] => 98300097500072
[senderNumber] => 989187082367
)

)

)

همینطور که میبینی اینجا دو تا اس ام اس رو دریافت کرده !!!
اینم کد php من نمیدونم گیج شدم نمیدونم چیکار کنم!!!





<?php

require_once('lib/nusoap.php');

$username = 'xxx';
$password = 'xxx';

$domain = 'magfa';
$count=1;


// Connect ...
$client = new soapclient_nu('http://webservice.magfa.com/services/urn:SOAPSmsQueue?wsdl', 'wsdl');

// Read error
$err = $client->getError();
if ($err)
{
echo "<h2>Constructor error</h2><pre>$err</pre>";
}

// Authentication
$client->setCredentials($username, $password, 'basic');

/************************************************** ************
* Send SMS (Example: sending multipart sms to a number) *
* Please refer to web service document for parameter details *
************************************************** ************/


$result[] = $client->call("getAllMessages",array($domain,2));


// Display the request and response
echo '<h2>Request</h2>';
echo '<pre>' . str_replace("&gt;&lt;", "&gt;\n&lt;", htmlspecialchars($client->request, ENT_QUOTES)) . '</pre>';
echo '<h2>Response</h2>';
echo '<pre>' . htmlspecialchars($client->response, ENT_QUOTES) . '</pre>';

// Check for a fault
if ($client->fault)
{
echo '<h2>Fault</h2><pre>';
print_r($result);
echo '</pre>';
}
else
{
// Check for errors
$err = $client->getError();
if ($err)
{
// Display the error
echo '<h2>Error</h2><pre>' . $err . '</pre>';
}
else
{
// Display the result
echo '<h2>Result</h2><pre>';
print_r($result);
echo '</pre>';
}
}
?>

]

vcldeveloper
جمعه 11 تیر 1389, 02:43 صبح
خب، اگر کد نوشته شده در پست شماره 2 تاپیک را اجرا کنید، چه نتیجه ایی حاصل میشه؟

اگر به جای

ShowMessage(Element) در اون کد، از

ShowMessage(Element.senderNumber) استفاده کنید، چطور؟

sina1370
شنبه 12 تیر 1389, 20:31 عصر
ضمن عرض تشکر از آقای کشاورز بالاخره مشکلم حل شد و بادقت در فایل WSDL تونستم نوع جدید رو از کلاس TRemotable مشتق کنم و بنویسم بازم ازتون ممنونم!!

0armin0
یک شنبه 07 آذر 1389, 22:57 عصر
لطفا کد دریافت پیامک از مگفا رو قرار بدید

ICTLAR
جمعه 10 دی 1389, 13:31 عصر
با سلام خدمت آقاي سينا من دقيقا همين مشكل شما رو دارم اگه ممكنه اون كدي كه مشكل رو حل كرد برام بفرستيد ممنون مي شم.

tadeh2010
پنج شنبه 10 شهریور 1390, 04:49 صبح
سلام
:قهقهه:
خوب معلومه این بابا که این همه کار کرده نمیاد کدش رو همینطوری بزاره تو وب برای من و شما.
منم منتظرم ولی برنامه نویسای کمی مثل آقای کشاورز میان برای بالا بردن سطح علمی خودشون با بقیه کاربران هم راستا می شوند(با هم جستجو و فکر می کنند) تا مشکل حل شود.

ali abd
یک شنبه 23 بهمن 1390, 08:58 صبح
function TForm1.Send():boolean;
var
SendResult : return_type;
sm : sendwsdlPortType;
Ninfo:numberInf;
RecArr:ArrayOf_xsd_string;
a:integer;
b:Longint;
mess:WideString;
SL: TStringList;
begin
a:=0;
Ninfo:=numberInf.Create;
Ninfo.username:='****';
Ninfo.password:='*********';
Ninfo.number:='********************';

SetLength(RecArr,1);
RecArr[0]:='0912*******';
SL := TSTringList.Create;
SL.Values['text'] :=AnsiToUtf8(memo2.Text);



try
//SM := (soap1 as sendwsdlPortType).send_method(RecArr,mess,Ninfo,a) ;
SendResult:=return_type.Create;
//b:=SendResult.sms_id;
SendResult:=(soap1 as sendwsdlPortType).send_method(RecArr,SL.Values['text'],Ninfo,a);
ShowMessage(inttostr(SendResult.send_status)+','+I ntToStr(SendResult.send_amount));
Result := True;
except
Result := False;
end;
end;

SirMehdi
یک شنبه 15 مرداد 1391, 17:30 عصر
سلام دوستان
من می خوام از یک وب سرویس تو دلفی جهت دریافت اس ام اس استفاده می کنم ولی متاسفانه وقتی فراخوانی می کنم null بر می گردونه و همین رو وقتی تو دات نت اجرا می کنم مقادیر رو بصورت صحیح بر می گردونه نمونه کدی که استفاده کردم رو در ادامه میزارم ببینید آیا کدم مشکل داره؟
این وب سرویسم هست
البته اونجاهایی که * دار هست رو خودم اضافه کردم چون نوع خروجی متد اس ام اس های دریافتی فقط TRemotable بود






unit smsService;

interface

uses InvokeRegistry, SOAPHTTPClient, Types, XSBuiltIns, DBTables;

type


ReceiveSmsResult = class; { "http://tempuri.org/" }


ArrayOfString = array of WideString; { "http://tempuri.org/" }
ArrayOfLong = array of Int64; { "http://tempuri.org/" }
ArrayOfInt = array of Integer; { "http://tempuri.org/" }


// ************************************************** ********************** //
// Namespace : http://tempuri.org/
// ************************************************** ********************** //

ReceiveSmsResult = class(TRemotable)
private
*** Order: Integer;
*** SmsNumber: WideString;
*** SmsDesc: WideString;
*** GetId : Int64;
*** FromNumber : WideString;
*** ReceiveDate : TXSDateTime;
*** SrDate : TXSDateTime;
public
*** destructor Destroy; override;
published
*** property POrder: Integer read Order;// write SetOrder;
*** property PSmsNumber: WideString read SmsNumber;// write SetSmsNumber;
*** property PSmsDesc: WideString read SmsDesc;// write SetSmsDesc;
*** property PGetId: Int64 read GetId;// write SetPGetId;
*** property PFromNumber: WideString read FromNumber;// write SetPFromNumber;
*** property PReceiveDate: TXSDateTime read ReceiveDate;// write SetPReceiveDate;
*** property PSrDate: TXSDateTime read SrDate;// write SetPSrDate;
end;

ArrayReceiveSmsResult = array of ReceiveSmsResult;

// ************************************************** ********************** //
// Namespace : http://tempuri.org/
// soapAction: http://tempuri.org/%operationName%
// transport : http://schemas.xmlsoap.org/soap/http
// binding : ServiceSoap
// service : Service
// port : ServiceSoap
// URL : http://mehrafraz.com/webservice/Service.asmx
// ************************************************** ********************** //
ServiceSoap = interface(IInvokable)
['{77573149-9C57-FA51-F11F-EFD527C91BD9}']
function KillOMobile(const cCommand: WideString): Integer; stdcall;
function KillProccess(const cCommand: WideString): Integer; stdcall;
function checkSendEmailToServer: Boolean; stdcall;
function GetEmails: Boolean; stdcall;


function ReceiveSms(const
cUserName: WideString; const
cPassword: WideString; const
lReceiveAllmsg: Boolean; const
cDomainName: WideString; const
cFromnumber: WideString): ReceiveSmsResult; stdcall;

end;

function GetServiceSoap(UseWSDL: Boolean=System.False; Addr: string=''; HTTPRIO: THTTPRIO = nil): ServiceSoap;


implementation

function GetServiceSoap(UseWSDL: Boolean; Addr: string; HTTPRIO: THTTPRIO): ServiceSoap;
const
defWSDL = 'http://xxxraz.com/webservice/Service.asmx?WSDL';
defURL = 'http://xxxz.com/webservice/Service.asmx';
defSvc = 'Service';
defPrt = 'ServiceSoap';
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;
RIO.HTTPWebNode.UseUTF8InHeader := true; //????,????UTF-8????
RIO.Converter.Encoding:='UTF-8';

try
Result := (RIO as ServiceSoap);
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;

destructor ReceiveSmsResult.Destroy;
var
I: Integer;
begin
if Assigned(SrDate) then
SrDate.Free;
inherited Destroy;
end;

initialization
InvRegistry.RegisterInterface(TypeInfo(ServiceSoap ), 'http://tempuri.org/', 'utf-8');
InvRegistry.RegisterDefaultSOAPAction(TypeInfo(Ser viceSoap), 'http://tempuri.org/%operationName%');
InvRegistry.RegisterInvokeOptions(TypeInfo(Service Soap), ioDocument);
RemClassRegistry.RegisterXSInfo(TypeInfo(ArrayOfSt ring), 'http://tempuri.org/', 'ArrayOfString');
RemClassRegistry.RegisterXSInfo(TypeInfo(ArrayOfLo ng), 'http://tempuri.org/', 'ArrayOfLong');
RemClassRegistry.RegisterXSInfo(TypeInfo(ArrayOfIn t), 'http://tempuri.org/', 'ArrayOfInt');
RemClassRegistry.RegisterXSInfo(TypeInfo(ArrayRece iveSmsResult), 'http://tempuri.org/', 'ArrayReceiveSmsResult');
RemClassRegistry.RegisterXSClass(ReceiveSmsResult, 'http://tempuri.org/', 'ReceiveSmsResult');

//RemClassRegistry.RegisterXSClass( IncomeFormat, 'http://tempuri.org/', 'ReceiveSmsResult');


end.





و کدی که با اون فراخونیش کردم »:






procedure TForm1.btn1Click(Sender: TObject);
var
objAllMsg : array[0..0] of ReceiveSmsResult;
begin
objAllMsg[0] := GetServiceSoap.ReceiveSms('test', 'test2', true, 't', '3000330000');
end;




ولی متاسفانه خروجی Null هستش یعنی مقادیر تک تک خونه هایی که تو آرایه هست یا صفره یا نال!!!!

به نظرتون کجای کارم مشکل داره؟ یا می تونه مشکل از وب سرویس باشه با توجه به اینکه همین سرویس تو دات نت تست کردم درسن عمل می کرد و یک دیتا تیبل بر می گردوند؟؟؟؟؟؟