小编jro*_*nhi的帖子

将AnsiString转换为Unicode字符串

我正在将D2006程序转换为D2010.我的数据库中每个字符串都有一个存储在单个字节中的值,我需要将其加载到具有LoadFromStream的控件中,因此我的计划是将字符串写入流并将其与LoadFromStream一起使用.但它没有用.在研究这个问题时,我看到一个问题告诉我,我真的不明白从AnsiString到Unicode字符串的转换是如何工作的.这是一段独立的代码,说明了我感到困惑的问题:

procedure TForm1.Button1Click(Sender: TObject); {$O-}
var
  sBuffer: String;
  oStringStream: TStringStream;
  sAnsiString: AnsiString;
  sUnicodeString: String;
  iSize1,
  iSize2: Word;
begin
  sAnsiString := '12345';
  oStringStream := TStringStream.Create(sBuffer);
  sUnicodeString := sAnsiString;
  iSize1 := StringElementSize(sAnsiString);
  iSize2 := StringElementSize(sUnicodeString);
  oStringStream.WriteString(sUnicodeString);
end;
Run Code Online (Sandbox Code Playgroud)

如果你在最后一行中断,并检查oStringStream的Bytes属性,你会看到它看起来像这样:

Bytes (49 {$31}, 50 {$32}, 51 {$33}, 52 {$34}, 53 {$35}
Run Code Online (Sandbox Code Playgroud)

我期待它可能看起来像

(49 {$31}, 00 {$00}, 50 {$32}, 00 {$00}, 51 {$33}, 00 {$00}, 
 52 {$34}, 00 {$00}, 53 {$35}, 00 {$00} ...
Run Code Online (Sandbox Code Playgroud)

显然我的期望是错误的.但是,如何将AnsiString转换为unicode?

我没有从LoadFromStream中获得正确的结果,因为它一次从流中读取两个字节,但它接收的数据不是那样排列的.我应该做些什么来为LoadFromStream提供基于unicode字符串的良好数据流?

谢谢您的帮助.

delphi unicode encoding delphi-2010

5
推荐指数
1
解决办法
2万
查看次数

调试SOAP传输

我正在尝试使用Delphi 2010和Indy进行Web服务的概念验证消费.我的代码是:

procedure TForm1.Log(const sEvent, sMsg: String);
const sPrior: String = '';
begin
  if sEvent <> sPrior then begin
    mTraffic.Lines.Append('');
    mTraffic.Lines.Append(Format('%s: %s', [sEvent, FormatDateTime('mm/dd/yyyy hh:nn:ss.zzz', Now)]));
    mTraffic.Lines.Append('--------------------------------------------------------------------------------');
    sPrior := sEvent;
  end;
  mTraffic.Lines.Append(sMsg);
  Application.ProcessMessages;
end;

function TForm1.BuildRequest: String;
const MINPERDAY = 1440;
var slRequest: TStringList;
    sFileName: String;
    sID: String;
    sGUID: String;
    oDoc: TNativeXML;
    oNode: TXmlNode;
    uNow: _SystemTime;
    dtNow: TDateTime;
    sNow: String;
    sNonce: String;
    oIdmd5: TIdHashMessageDigest5;
begin
  sFileName := 'Send.xml';
  slRequest := TStringList.Create;
  oIdmd5 := TIdHashMessageDigest5.Create;
  oDoc := TNativeXML.Create;
  try
    oDoc.LoadFromFile(sFileName);
    SetAttrib(oDoc, …
Run Code Online (Sandbox Code Playgroud)

delphi indy delphi-2010

5
推荐指数
1
解决办法
3999
查看次数

SOAPUI中的错误请求

我正在尝试使用Delphi 2010和Indy来使用Web服务.要建立一个可用的SOAP流来与我的程序创建的SOAP流进行比较,我在SOAPUI中进行测试.我正在使用Web服务提供程序提供的SOAP流,它也匹配WSDL文件中指定的SOAP流.我从服务中收到HTTP 400(错误请求)错误.

从我在网上找到的内容来看,似乎收到HTTP 400错误表明您的SOAP请求格式错误且Web服务无法读取.我已经使用XMLPad测试了我的SOAP流,并且XML似乎已经很好地形成了.我想这可能意味着某些东西与其架构要求不匹配.如果不希望以纯文本形式发送,我将首先检查密码的模式描述.我还应该检查什么以消除HTTP 400错误?

这是我的请求(更少的用户名和密码),如果有帮助:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" 
xmlns:wsa="http://schemas.xmlsoap.org/ws/2004/08/addressing" 
xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" 
xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" 
xmlns:xop="http://www.w3.org/2004/08/xop/include" 
xmlns:xsd="http://www.w3.org/2001/XMLSchema" 
xmlns:xsi="http://wwww3.org/2001/XMLSchema-instance">
   <soap:Header>
      <wsa:Action>http://edd.ca.gov/SendTransmission</wsa:Action>
      <wsa:MessageID>urn:uuid:5aa788dc-86e1-448b-b085-2d2743cf9f26</wsa:MessageID>
      <wsa:ReplyTo>
         <wsa:Address>http://schemas.xmlsoap.org/ws/2004/08/addressing/role/anonymous</wsa:Address>
      </wsa:ReplyTo>
      <wsa:To>http://fsettestversion.edd.ca.gov/fsetproxy/fsetservice.asmx</wsa:To>
      <wsse:Security soap:mustUnderstand="1">
         <wsse:UsernameToken wsu:Id="UsernameToken">
            <wsse:Username>#USERNAME#</wsse:Username>
            <wsse:Password Type="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-username-token-profile-1.0#PasswordText">#PASSWORD#/wsse:Password>
            <wsse:Nonce EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary">O5QWht1bslLCX6KnlEypAA==</wsse:Nonce>
            <wsu:Created>2012-02-29T22:32:38.250Z</wsu:Created>
         </wsse:UsernameToken>
         <wsu:Timestamp wsu:Id="Timestamp-805a7373-335c-43b6-ba21-6596c4848dbf">
            <wsu:Created>2012-02-22T15:41:42Z</wsu:Created>
            <wsu:Expires>2012-02-22T15:46:42Z</wsu:Expires>
         </wsu:Timestamp>
      </wsse:Security>
   </soap:Header>
   <soap:Body>
      <SendTransmission xmlns="http://edd.ca.gov/">
         <SendTransmissionRequest xmlns="http://www.irs.gov/a2a/mef/MeFTransmitterServiceWse.xsd">
            <TransmissionDataList>
               <Count>1</Count>
               <TransmissionData>
                  <TransmissionId>123456789</TransmissionId>
                  <ElectronicPostmark>2012-02-22T07:41:42.2502206-08:00</ElectronicPostmark>
               </TransmissionData>
            </TransmissionDataList>
         </SendTransmissionRequest>
         <fileBytes>
            <xop:Include href="cid:1.634654933022658454@example.org"/>
         </fileBytes>
      </SendTransmission>
   </soap:Body>
</soap:Envelope>
Run Code Online (Sandbox Code Playgroud)

delphi soap indy delphi-2010

5
推荐指数
1
解决办法
1888
查看次数

如何为 SOAP 客户端完成 XML

我正在尝试实现一个 SOAP 客户端来处理由以下位置的 WSDL 文件描述的 Web 服务的加州工资税电子报告:FSET Service。在此 WSDL 文件中,引用了多个模式,其中包括http://schemas.xmlsoap.org/ws/2004/08/addressing中的一个模式,该模式似乎在程序到达 OnBeforeExecute 事件之前就将其停止。

为了开始这个项目,我尝试访问WSDL 文件中声明的Ping函数。

我现在刚刚获得一些在 Delphi 中创建 SOAP 客户端的经验。我正在使用 Delphi 2010。这是我为达到这一点所做的事情。我使用 WSDL 导入器导入上述地址的文件。它为我创建了一个名为 fsetservice 的单元。然后,我向项目添加了一个表单,并在其中添加了 HTTPRIO 组件。我将组件的 WSDLLocation 设置为 WSDL 文件的本地副本,在表单上放置几个 TMemos 以捕获请求和响应标头,并添加代码来执行此操作。然后我设置了一个按钮,并在其 OnClick 事件中编写了以下代码:

procedure TForm1.Button1Click(Sender: TObject);
var sResponse: String;
begin
  sResponse := GetFsetServiceSoap.Ping;
end;
Run Code Online (Sandbox Code Playgroud)

当我单击该按钮时,在到达 HTTPRIO OnBeforeExecute 事件中的断点之前收到此消息:

标头http://schemas.xmlsoap.org/ws/2004/08/addressing:需要最终收件人的操作,但未出现在消息中

我知道我们每个帖子应该只问一个问题,但有时您的了解不够,无法只问一个好问题:

编辑:为了节省其他有相同问题的人的时间,我将我找到的答案放在这些问题下。

看起来 HTTPRIO 组件可能正在根据 WSDL 中引用的模式检查从 WSDL 文件导入的 XML 的完整性。这看起来很酷,但这是真的吗?

*答案:不正确,至少根据http://www.tutorialspoint.com/wsdl/wsdl_definition.htm页面底部的注释。根据注释,该模式不必实际存在于该位置,它只需唯一标识 WSDL 中使用的模式即可。*

在自动创建(且未修改)的 GetFsetService 函数中,我可以一直单步执行到最后,并且错误发生在返回时,似乎不可能单步进入调用错误的实际过程。有没有办法做到我所缺少的?

回答:我仍然不确定这一点,但似乎答案是否定的。无论如何,尽管从头开始编写此代码会更加乏味,但这比等待 WSDL 向导出现奇迹是一个更好的解决方案。

我是否错过了一些内容,说我需要实现为我自动创建的 …

delphi

4
推荐指数
1
解决办法
6444
查看次数

在Fiddler看到Indy交通

我认为对于熟悉Indy的人来说,这是一个简单的问题.我正在使用Delphi 2010和Indy 10.我正试图开始访问SSL Web服务.我认为如果我能让Fiddler看到我的HTTP流量会更容易.我已经看到StackOverflow上的帖子表明让Fiddler看到你的Indy流量并不重要,你必须配置端口才能使它工作.我的问题是你是怎么做到的?

到目前为止,这是我的代码:

procedure TForm1.Button1Click(Sender: TObject);
var slRequest: TStringList;
    sResponse,
    sFileName: String;
    lHTTP: TIdHTTP;
    lIOHandler: TIdSSLIOHandlerSocketOpenSSL;
begin
  sFileName := 'Ping.xml';
  slRequest := TStringList.Create;
  try
    slRequest.LoadFromFile(sFileName);
    lHTTP := TIdHTTP.Create(nil);
    lHTTP.Intercept := IdLogDebug1;
    lIOHandler := TIdSSLIOHandlerSocketOpenSSL.Create(nil);
    try
      lHTTP.IOHandler := lIOHandler;
      sResponse := lHTTP.Post('https://FSETTESTPROD.EDD.CA.GOV/fsetservice', slRequest);
      Memo1.Lines.Text := sResponse;
    finally
      lIOHandler.Free;
    end;
  finally
    slRequest.Free;
  end;
end;
Run Code Online (Sandbox Code Playgroud)

编辑:如果我没有使用Fiddler的代理并在Wireshark运行时单击按钮,我会在Wireshark中获得此流量. 在此输入图像描述

delphi indy

4
推荐指数
1
解决办法
2985
查看次数

欢迎页面添加到收藏夹

我正在使用Delphi 2010.是否已取消欢迎页面上添加到收藏夹的功能?我仍然有管理收藏夹,但它只添加编辑和删除选项.也许现在有一种新方法可以添加到收藏夹中.我错过了它.

ide delphi

2
推荐指数
1
解决办法
1036
查看次数

标签 统计

delphi ×6

delphi-2010 ×3

indy ×3

encoding ×1

ide ×1

soap ×1

unicode ×1