+ -
当前位置:首页 → 问答吧 → 继续昨天的话题,VB调用delphi控件的问题

继续昨天的话题,VB调用delphi控件的问题

时间:2011-07-24

来源:互联网

Delphi(Pascal) code
library SSWSDataInterface;

uses

  SysUtils,
  Classes,
  PublicConstStr in 'PublicConstStr.pas',
  CommonFunc in 'CommonFunc.pas',
  DataInterfaceUnit in 'DataInterfaceUnit.pas',
  DataStreamRar in 'DataStreamRar.pas';

{$E dll}

{$R *.res}

function TSDataCompress(const AInputData:PChar; var AOutputData:PWideChar;
  var AMessage:PWideChar):Integer; stdcall;
var
  strOutputData:WideString;
  StrInputData:PWideChar;

begin
  try //40
    Result := -1;

    try //40
      StrInputData:=PWideChar(WideString(AInputData));
      Result := TransfersDataCompress(StrInputData, strOutputData, AMessage);
    except
      on E:Exception do
        begin
          AMessage := PWideChar(WideString(E.Message));
          Exit;
        end;
    end; //40

    if Result = 0 then
      begin
        strOutputData := Copy(strOutputData, 1, cst_WideCharSize - 1);
        StringToWideChar(strOutputData, AOutputData, cst_WideCharSize * 2 + 1);
      end;

  finally
  end; //40
end;

function TSDataDeCompress(const AInputData:PWideChar; var AOutputData:PWideChar;
  var AMessage:PWideChar):Integer; stdcall;
var
  strOutputData:WideString;
begin
  try //40
    Result := -1;

    try //40
      Result := TransfersDataDeCompress(AInputData, strOutputData, AMessage);
    except
      on E:Exception do
        begin
          AMessage := PWideChar(WideString(E.Message));
          Exit;
        end;
    end; //40

    if Result = 0 then
      begin
        strOutputData := Copy(strOutputData, 1, cst_WideCharSize - 1);
        StringToWideChar(strOutputData, AOutputData, cst_WideCharSize * 2 + 1);
      end;

  finally
  end; //40
end;

exports
  TSDataCompress name 'TSDataCompress',
  TSDataDeCompress name 'TSDataDeCompress';

begin
end.




VB code
Option Explicit
Private Declare Function TSDataCompress Lib "c:\SSWSDataInterface.dll" (AInputData As String, AOutputData As String, AMessage As String) As Integer
Private Declare Function TSDataDeCompress Lib "c:\SSWSDataInterface.dll" (AInputData As String, AOutputData As String, AMessage As String) As Integer
Private Sub Command1_Click()
    Dim strInput As String
    Dim strOutput As String
    Dim strMessage As String
    Dim intP As Integer
    strInput = Text1.Text
'    strInput = StrConv(strInput, vbWide)

    strOutput = String(50000, vbNullChar)
    strMessage = String(50000, vbNullChar)
    intP = TSDataCompress(strInput, strOutput, strMessage)
    Debug.Print strOutput
    Debug.Print strMessage
    MsgBox StrConv(strMessage, vbFromUnicode)
    Text2.Text = StrConv(strOutput, vbFromUnicode)
End Sub


delphi的代码是控件的源码,在delphi中引用这个控件和在VB中引用这个控件,得出的结果不一样。新手,实在找不出问题所在,还请大神们帮忙看看

作者: zydyw   发布时间: 2011-07-24

具体哪里不一样呢?我只看到代码是不一样。。。

作者: sysdzw   发布时间: 2011-07-24

如传入参数文本 “select top 200 * from 农户信息”
在Vb中得到的结果是 :BQAAAHja2zBbipcLAAZTAX0=
而在delphi中得出的结果是:IAAAAHjaK07NSU0uUSjJL1AwMjBQ0FJwK8rPVTi6cvfyC0fPL+LlAgC+pAyx

作者: zydyw   发布时间: 2011-07-24

Delphi(Pascal) code
procedure TForm1.Button2Click(Sender:TObject);
var
  AInputData:PWideChar;
  AOutputData:PWideChar;
  AMessage:PWideChar;
  a:WideString;
  intResult:SmallInt;
begin
  try
    a := Trim(Memo1.Text);
    AInputData := PWideChar(a);
    GetMem(AOutPutData, cst_Size);
    StringToWideChar('', AOutputData, cst_Size);
    intResult := TSDataCompress(AInputData, AOutputData, AMessage);
    //ShowMessage(IntToStr(intResult));
    Memo2.Clear;
    //Memo2.Lines.Add('错误信息:');
    //Memo2.Lines.Add(AMessage);
    //Memo2.Lines.Add(IntToStr(Length(AOutputData)));
    //Memo2.Lines.Add('返回结果::');
    Memo2.Lines.Add(AOutputData);
    Memo2.SelStart := 0;
  finally
    FreeMem(AOutPutData);
  end;
end;


这是delphi中的调用过程

作者: zydyw   发布时间: 2011-07-24

呵呵,楼主还在纠结啊。。。

作者: Veron_04   发布时间: 2011-07-24