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

## aliasghar

سلام 
من برای ارسال sms توسط نرم افزار در دلفی از وب سرویس استفاده می کنم
با ارسال پیام های لاتیم مشکلی نیست
ولی اگر پیام را بصورت فارسی تایپ کنم دروم موبایل بورت ????????? نوشته میشود
این مشکل زمانی رخ میدهد که من نرم افزار را در ویندوز 7 کامپایل کنم
اگر نرم افزار را در ویندوز xp کامپایل کنم این مشکل را ندارم


ممنون از راهنمایی دوستانه شما

----------


## Valadi

شما در ويندوز تان يونيكد را نصب كنيد

----------


## BORHAN TEC

نسخه دلفی شما چیست؟

----------


## aliasghar

سلام
من از دلفی 7 و ویندوز 7 نسخه 32 بیتی استفاده می کنم

نمی دونم چطور باید در ویندوز یونیکد را نصب کرد البته ویندوز بطور کامل فارسی شده و من نرم افزارهایم را بصورت فارسی طراحی میکنم

نکته : اگر از همین وب سرویس در #C  استفاده کنم پیام بصورت صحیح ارسال می شود

ممنون

----------


## mohsen24000

یا از دلفی 2009 و به بالا استفاده کن و یا از کامپوننتهای یونیکد مثل TNT روی دلفی 7 تا مشکل یونیکد حل بشه و یا خودت باید کار تبدیل به یونیکد رو انجام بدی...!

----------


## aliasghar

من از کامپوننتهای TNT هم استفاده کردم ولی باز هم جواب نگرفتم
کسی م تونه با یک تکه کد تبدیل یک رشته معمولی string را به رشته unicode از نوع widestring 
 را به من بگه
ممنون

----------


## arkia

دوستان نتیجه چی شد؟ منم همین مشکل رو دارم

----------


## BORHAN TEC

http://help.multilizer.com/devzone/d...izing-symbols/
http://stackoverflow.com/questions/3...-versions-2007

----------


## arkia

> http://help.multilizer.com/devzone/d...izing-symbols/
> http://stackoverflow.com/questions/3...-versions-2007


ممنون ، خوندم اما چیزی سر در نیاوردم ازشون  :متفکر:  میشه خودتون یه توضیحی بدید؟

----------


## BORHAN TEC

اگه با این کارها مشکلتون حل نشد می تونید از یه راه بهتر استفاده کنید.
شما می توانید آن قسمت از برنامه که مربوط به استفاده از وب سرویس است را در نسخه های جدیدتر دلفی بسازید و در نسخه های قدیمی تر دلفی از آن استفاده کنید. می توانید برای این منظور از dll ها استفاده کنید.

----------


## arkia

> اگه با این کارها مشکلتون حل نشد می تونید از یه راه بهتر استفاده کنید.
> شما می توانید آن قسمت از برنامه که مربوط به استفاده از وب سرویس است را در نسخه های جدیدتر دلفی بسازید و در نسخه های قدیمی تر دلفی از آن استفاده کنید. می توانید برای این منظور از dll ها استفاده کنید.


من  تو XE مشکلی ندارم اما توی دلفی 7 وب سرویسی که استفاده می کنم کاراکتر های غیر یونیکد یا utf8 رو فیلتر میکنه. توی دلفی xe کامپاننتش رو ساختم اما وقتی تو 7 نصبش کردم بازم فیلترش میکنه حتی با کد های مختلف سعی کردم تبدیل به یونیکد کنم اما نشد که نشد. dll رو امتحان نکردم

----------


## BORHAN TEC

این به خاطر اینه که Delphi 2009 و نسخه های جدیدتر به صورت کامل از یونیکد *پشتیبانی* *می کنند* ولی نسخه های قدیمی تر دلفی از یونیکد *پشتیبانی نمی کنند.*

----------


## arkia

> این به خاطر اینه که Delphi 2009 و نسخه های جدیدتر به صورت کامل از یونیکد *پشتیبانی* *می کنند* ولی نسخه های قدیمی تر دلفی از یونیکد *پشتیبانی نمی کنند.*


راه حل چیه آقای عشایری؟

----------


## Mahbod Rad

از تابع AnsiToUtf8() برای تبدیل پیام فارسی و ارسال استفاده کنید :چشمک:

----------


## arkia

> از تابع AnsiToUtf8() برای تبدیل پیام فارسی و ارسال استفاده کنید


امتحان کردم اما نشد

----------


## BORHAN TEC

> امتحان کردم اما نشد


باید اول ببینیم که دلفی شما چطور اینترفیس اون وب سرویس رو generate کرده؟!!! اگر پارامترهای رشته رو به صورت String مشخص کرده باشه باید اونها رو به نوع دیگه ای مثل WideString تغییر بدین. چرا که اگر در نسخه های قدیمی یک متن یونیکد رو در String بریزید اطلاعات گم می شود و در نهایت کاراکتر ها به صورت عجیب و غریب فرستاده می شوند و دلیل آن هم این است که در نسخه های قدیمی String معادل AnsiString است. ولی در نسخه های 2009 تا خود XE3(که تا زمان نوشتن این پست آخرین نسخه است) نوع داده String معادل UnicodeString است.

----------


## Mahbod Rad

من برنامه ام را با دلفی 7 نوشته ام و تیکه کد زیر قسمتی است که پیام را ارسال میکند
از خدمات شرکت میزبان پایتخت استفاده شده است و البته من از طریق URL اقدام به ارسال پیامک میکنم

var
 Snd_Msg,Snd_FullNumber:string;
..
begin
..
            FrmSMSProcces.HTTPReqResp1.URL:='http://panel.mizbansms.ir/eapi.aspx?username='+FrmSMSProcces.WebId.Text+
                                                                               '&password='+FrmSMSProcces.WebPas.Text+
                                                                               '&api='+FrmSMSProcces.WebApi.Text+
                                                                               '&text='+AnsiToUtf8(Snd_Msg)+
                                                                               '&to='+Snd_FullNumber+
                                                                               '&from='+FrmSMSProcces.WebNumber.Text;
            FrmSMSProcces.HTTPReqResp1.Get(Res);
..
end;

----------


## arkia

> من برنامه ام را با دلفی 7 نوشته ام و تیکه کد زیر قسمتی است که پیام را ارسال میکند
> از خدمات شرکت میزبان پایتخت استفاده شده است و البته من از طریق URL اقدام به ارسال پیامک میکنم
> 
> var
>  Snd_Msg,Snd_FullNumber:string;
> ..
> begin
> ..
>             FrmSMSProcces.HTTPReqResp1.URL:='http://panel.mizbansms.ir/eapi.aspx?username='+FrmSMSProcces.WebId.Text+
> ...


از چه ورژن دلفی استفاده می کنید؟

----------


## BORHAN TEC

سلام



> از چه ورژن دلفی استفاده می کنید؟


بنده خدا دیگه چطوری بنویسه دلفی 7. خداییش یه بار خط اول پستی که نقل قول کردی رو بخون.  :لبخند:

----------


## Mask

> خدمات شرکت میزبان پایتخت


دوستان از چه وب سرویس برای ارسال اسمس تا به حال استفاده کردند که هم مطمئن باشه و هم با دلفی بشه باهاش کار کرد و دلیوریشو گرفت؟
این شرکتی که نوشتید سایتش چیه؟

----------


## arkia

> سلام
> 
> بنده خدا دیگه چطوری بنویسه دلفی 7. خداییش یه بار خط اول پستی که نقل قول کردی رو بخون.


بله شرمنده  :خجالت:  آخه من خیلی با 7 مشکل دارم حساس شدم!  :لبخند گشاده!:

----------


## یوسف زالی

سلام. می بخشین میام وسط بحث.
من این مشکل رو برای نرم افزار اس ام اس با دلفی 7 و سون داشتم.
بگزدید دنبال UseUTF8InHeader در شی HTTP.
اون رو به سادگی true کنید.

راستی Gold جان من با AFE کار می کنم. فعلا که خدا رو شکر خوب هست.

----------


## arkia

> سلام. می بخشین میام وسط بحث.
> من این مشکل رو برای نرم افزار اس ام اس با دلفی 7 و سون داشتم.
> بگزدید دنبال UseUTF8InHeader در شی HTTP.
> اون رو به سادگی true کنید.
> 
> راستی Gold جان من با AFE کار می کنم. فعلا که خدا رو شکر خوب هست.


من هنوز مشکلم حل نشده این هم امتحان کردم اما جواب نمیده میشه بیشتر توضیح بدی ؟

----------


## یوسف زالی

کدی که می گی امنحان کردی رو بگذار

----------


## arkia

> کدی که می گی امنحان کردی رو بگذار


ممنون دوست عزیز.

این لینک وب سرویس منه

http://ws.smspishkhan.ir/SmsService.asmx?wsdl

این هم کد دلفی 7:

procedure TForm1.Button1Click(Sender: TObject);
var
  WS: SmsServiceSoap;
  H: AccountCredentials;
  E:string;
begin
  WS := GetSmsServiceSoap;
  try
    H := AccountCredentials.Create;
    H.username := username.Text;
    H.password:=password.Text;
    (WS as ISOAPHeaders).Send(H);
    E:=WS.SendMessage(lineno.Text,body.Text,recipient.  Text,messageclass.ItemIndex,scheduletime.Text).Err  orDesc;
    ShowMessage(E);
  finally
  end;
end;


توی دلفی XE این کد کار میکنه اما توی دلفی 7 وقتی با برنامه Fiddler خروجی xml رو نیگاه می کنم میبینم 

به جای کد:

<?xml version="1.0" encoding="UTF-8"?>


کد:

<?xml version="1.0"?>


ارسال میشه.

حالا من توی فایلی که Importer درست  می کنه این کدی که فرمودید "UseUTF8InHeader "  رو  اضافه کردم:


function GetSmsServiceSoap(UseWSDL: Boolean; Addr: string; HTTPRIO: THTTPRIO): SmsServiceSoap;
const
  defWSDL = 'http://ws.smspishkhan.ir/SmsService.asmx?wsdl';
  defURL  = 'http://ws.smspishkhan.ir/SmsService.asmx';
  defSvc  = 'SmsService';
  defPrt  = 'SmsServiceSoap';
var
  RIO: THTTPRIO;
begin
  Result := nil;
  if (Addr = '') then
  begin
    if UseWSDL then
      Addr := defWSDL
    else
      Addr := defURL;
  end;
  if HTTPRIO = nil then
  begin
    RIO := THTTPRIO.Create(nil);
 rio.HTTPWebNode.UseUTF8InHeader:=true;   // این کد
  end
  else
    RIO := HTTPRIO;
  try
    Result := (RIO as SmsServiceSoap);
    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;


اما باز هم مشکل قبل سر جاش باقیه یعنی کاراکتر ها به صورت علامت سوال ارسال میشه.

----------


## arkia

با این هم جواب نمیده

RIO.Converter.Encoding:='utf-8';


می خوام این هم امتحان کنم اما خطا ی syntax  میده

RIO.Converter.Options := [soUTF8InHeader];

----------


## یوسف زالی

1- لینک WSDL خرابه.
2- به جای روش Get خودتون شی بگیرید.
3- اون متد if داره که شما فقط در یک جاش کد رو گذاشتید.

این روش رو دنبال کنید:
یک شی HTTPRIO روی فرم بگذارید.
در OnCreate فرم بنویسید   HTTPRIO1.HTTPWebNode.UseUTF8InHeader := true;
در متد ارسال :
WS := (HTTPRIO1 as SmsServiceSoap); // casting
و در ادامه :
WS.SendSMS..

اگر هیچ کدوم کمکی نکرد یوزر پس موقتی رو برام پیام خصوصی کنید بررسی کنم.

----------


## arkia

> 1- لینک WSDL خرابه.
> 2- به جای روش Get خودتون شی بگیرید.
> 3- اون متد if داره که شما فقط در یک جاش کد رو گذاشتید.
> 
> این روش رو دنبال کنید:
> یک شی HTTPRIO روی فرم بگذارید.
> در OnCreate فرم بنویسید   HTTPRIO1.HTTPWebNode.UseUTF8InHeader := true;
> در متد ارسال :
> WS := (HTTPRIO1 as SmsServiceSoap); // casting
> ...


ممنون که پیگیری کردید. لینک درسته اون کاری که گفتید هم انجام دادم اما بازم نشد. یه لطفی بکنید خودتون یه نگاهی بندازید. یوزر پس نمیخواد چون اگر درست ارسال بشه ( علامت سوال نره) پیغام میده که نام کاربری یا کلمه عبور صحیح نیست اما اگر توی یه انکودینگ دیگه ارسال بشه و وب سرویس علامت سوال بگیره پیغام میده که کاربر مورد نظر یافت نشد. میتونید با دلفی xe امتحان کنید اما مشکل من تو دلفی 7 ه .

----------


## یوسف زالی

یک نکته رو فراموش کردم بگم. در شی HTTPRIO باید WSDL و PORT و Service رو هم تنظیم کنید.
نمی دونم چرا آدرسی که دادید در اینجا (تهران - پارس آنلاین) وجود خارجی نداره!
http://ws.smspishkhan.ir/SmsService.asmx?wsdl
http://ws.smspishkhan.ir/SmsService.asmx
http://ws.smspishkhan.ir/
http://www.smspishkhan.ir/
http://smspishkhan.ir/contactus.aspx
http://www.smspishkhan.ir/AboutUs.aspx

 :متفکر:

----------


## arkia

احتمالا به خاطر اینه که سرورش کرجه اینطوریه نمیدونم اما اینجا باز میشه اینترنت من مال مخابراته. آدرس وب سرویس رو هم میدم بهش پورت هم نیازی به تنظیم نداره (قبلا میخواست اما الان برش داشتن) Service رو نمیدونم چیه اما دیشب که امتحان کردم (با قرار دادن شی روی فرم) وب سرویس پاسخ داد اما هنوز با انکودینگ خودش ارسال میشه

----------


## یوسف زالی

منظوره از اونها Property های شی HTTPRIO هست.  خصوصیات Port و Service بعد از ست کردن WSDLLocation قابل دسترس می شن.
در هر حال اینجا که همه چیز خوبه!
اگر نیاز شدید داشتید خصوصی بنده رو آگاه کنید.

----------

