Announcement

Collapse
No announcement yet.

Win32-Client "array of record" Transfer nach .NET Enterprise Services

Collapse
X
  • Filter
  • Time
  • Show
Clear All
new posts

  • Win32-Client "array of record" Transfer nach .NET Enterprise Services

    Hallo,

    habe einen .NET Enterprise Service in C# geschrieben. Zu diesem Server möchte ich über ein Interface ein "array of record" von einem Win32-Client, der in Delphi 7 geschreiben ist, senden.

    Server (C#):

    struct Info {
    string Name;
    int Value;
    }

    public interface ITest {
    int Transfer(Info[] Data);
    }

    Wenn ich die Typenbibliothek in Delphi importiere erhaltet in dieses Interface:

    IProduction = interface(IDispatch)
    ['{BBDDAE01-B1D3-4D9C-9FF2-92EB3886E5E3}']
    function Transfer(Data: PSafeArray): Integer; safecall;
    end;

    Hat jemand Erfahrung damit wie das PSaveArray zu erstellen und zu füllen ist?

    Gruß Michael.

  • #2
    Hallo,
    wenn die "alte" Welt (Win32) eine Datenstruktur an die "neue" Welt (.NET) übergeben will, muss man zuerst die Frage klären, wer die Anpassung der Datentypen übernimmt. Da beim Aufruf mehrere "Datensätze" übergeben werden sollen, ist das Hantieren mit einer <i>Recordset</i>-Instanz (ADO) sinnvoll - denn in diesem Fall kümmert sich MDAC/ADO.NET um die notwendige Anpassung.
    <br>
    Ein Delphi 7-Client für <i>PSafeArray</i> könnte zum Beispiel so aussehen:
    <code>
    <font color="#003399"><i>{
    Inhalt einer binären DOC-Datei über ein SafeArray transportieren
    }</i></font>

    <b>procedure</b> TForm1.Button1Click(Sender: TObject);
    <b>var</b>
    vData : OleVariant;
    aSrv : _ZFDManager;
    <b>begin</b>
    vData := OSReadFileData(<font color="#9933CC">'C:\Temp\Test.doc'</font>);
    aSrv := CoZFDManager.Create;
    aSrv.DoSaveDocContent(PSafeArray(TVarData(vData).V Array));
    StatusBar1.SimpleText := <font color="#9933CC">'Fertig.'</font>;
    <b>end</b>;

    <b>function</b> TForm1.OSReadFileData(<b>const</b> sFilename: WideString): OleVariant;
    <b>var</b>
    aMS : TMemoryStream;
    iSize : Integer;
    pData : PChar;
    <b>begin</b>
    aMS := TMemoryStream.Create;
    <b>try</b>
    aMS.LoadFromFile(sFilename);
    iSize := aMS.Size;
    aMS.Position := 0;
    Result := VarArrayCreate([0, iSize - 1], varByte);
    pData := VarArrayLock(Result);
    <b>try</b>
    aMS.<b>Read</b>(pData^, iSize);
    <b>finally</b>
    VarArrayUnlock(Result);
    <b>end</b>;
    <b>finally</b>
    aMS.Free;
    <b>end</b>;
    <b>end</b>;
    </code>
    Das C#-Gegenstück dazu sieht dann so aus:
    <code>
    <b>public</b> <b>int</b> SaveFileContent(<b>byte</b>[] aBLOBBuffer, <b>ref</b> <b>string</b> sMsg)
    {
    <b>int</b> iReturn = 0;
    <b>try</b>
    {
    SqlConnection aCon = <b>new</b> SqlConnection(sCS);
    SqlCommand aCmd = <b>new</b> SqlCommand(sSQL, aCon);
    aCmd.Parameters.Add(<font color="#9933CC">&quot;@blob&quot;</font>, SqlDbType.VarBinary, 2147483647, <font color="#9933CC">&quot;blob&quot;</font>).Value = aBLOBBuffer;
    aCon.Open();
    <b>try</b>
    {
    aCmd.ExecuteNonQuery();
    <font color="#003399"><i>// alles in Ordnung</i></font>
    iReturn = 1;
    }
    <b>finally</b>
    {
    aCon.Close();
    aCmd.Dispose();
    aCon.Dispose();
    }
    ContextUtil.SetComplete();
    }
    <b>catch</b> (Exception aExc)
    {
    sMsg = aExc.Message + Environment.NewLine + aExc.StackTrace;
    ContextUtil.SetAbort();
    }
    <b>return</b> iReturn;
    }
    </code&gt

    Comment

    Working...
    X