# Native Code > برنامه نویسی در Delphi > توسعه نرم افزار تحت وب >  define new type

## sina1370

سلام من یه تابع دارم که آرایه ای از 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

این تابع 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

ضمن عرض تشکر از توجهتون....
از دلفی 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

> پس چرا این ساختارو به صورت  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

این یه نمونه از 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:CustomerReturnIncomingForma  t[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

خب، اگر کد نوشته شده در پست شماره 2 تاپیک را اجرا کنید، چه نتیجه ایی حاصل میشه؟

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

----------


## sina1370

ضمن عرض تشکر از آقای کشاورز بالاخره مشکلم حل شد و بادقت در فایل WSDL تونستم نوع جدید رو از کلاس TRemotable مشتق کنم و بنویسم بازم ازتون ممنونم!!

----------


## 0armin0

لطفا کد دریافت پیامک از مگفا رو قرار بدید

----------


## ICTLAR

با سلام خدمت آقاي سينا من دقيقا همين مشكل شما رو دارم اگه ممكنه اون كدي كه مشكل رو حل كرد برام بفرستيد ممنون مي شم.

----------


## tadeh2010

سلام
 :قهقهه: 
خوب معلومه این بابا که این همه کار کرده نمیاد کدش رو همینطوری بزاره تو وب برای من و شما.
منم منتظرم ولی برنامه نویسای کمی مثل آقای کشاورز میان برای بالا بردن سطح علمی خودشون با بقیه کاربران هم راستا می شوند(با هم جستجو و فکر می کنند) تا مشکل حل شود.

----------


## ali abd

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

سلام دوستان
من می خوام از یک وب سرویس تو دلفی جهت دریافت اس ام اس استفاده می کنم ولی متاسفانه وقتی فراخوانی می کنم 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 هستش یعنی مقادیر تک تک خونه هایی که تو آرایه هست یا صفره یا نال!!!!

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

----------

