Einzelnen Beitrag anzeigen

Benutzerbild von ich2
ich2

Registriert seit: 7. Dez 2005
Ort: Würzburg
54 Beiträge
 
#1

DLL - C nach Delphi konvertieren

  Alt 6. Mär 2017, 09:41
Hallo liebe Community,

bei der Übersetzung eines Headers für den Zugriff auf eine DLL scheint ein Fehler zu sein...zumindest funktioniert nur ein Teil der Kommandos...

Auszug aus der DobotDll.h Datei:
Code:
#ifndef DOBOTDLL_H
#define DOBOTDLL_H

#include "DobotType.h"

...

extern "DobotDll.dll" int SetPTPCmd(PTPCmd *ptpCmd, bool isQueued, uint64_t *queuedCmdIndex);

...

#endif // DOBOTDLL_H
und Auszug aus der DobotType.h Datei

Code:
#ifndef DOBOTTYPE_H
#define DOBOTTYPE_H

#ifdef _MSC_VER
typedef unsigned char uint8_t;
typedef signed char int8_t;
typedef unsigned short uint16_t;
typedef signed short int16_t;
typedef unsigned int uint32_t;
typedef signed int int32_t;
typedef unsigned long long uint64_t;
typedef signed long long int64_t;
#else
#include <stdint.h>
#endif

...

#pragma pack(push)
#pragma pack(1)

...

typedef struct tagPTPCmd {
    uint8_t ptpMode;
    float x;
    float y;
    float z;
    float r;
}PTPCmd;

...

#pragma pack(pop)
#endif
...dann noch ein weiterer Auszug aus einem C# Beispiel:

DobotDllType.cs
Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;

namespace DobotClientDemo.CPlusDll

...

    [StructLayout(LayoutKind.Sequential, CharSet = CharSet.Ansi, Pack = 1)]
    public struct PTPCmd
    {
        public byte ptpMode;
        public float x;
        public float y;
        public float z;
        public float rHead;
    };

...

}
und aus der Dobot.cs
Code:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Text;

namespace DobotClientDemo.CPlusDll

...

        [DllImport("DobotDll.dll", EntryPoint = "SetPTPCmd", CallingConvention = CallingConvention.Cdecl)]
        public static extern int SetPTPCmd(ref PTPCmd playbackCmd, bool isQueued, ref UInt64 queuedCmdIndex);


...

}

...an sich alles kein Problem, nun der übersetzte Part in Delphi:

Delphi-Quellcode:
unit UDobot_Interface;

interface

type

...

  TPTPCmd = record
    ptpMode: Byte;
    x: single;
    y: single;
    z: single;
    r: single;
  end;
  PPTPCmd = ^TPTPCmd;

...

  function SetPTPCmd ( ptpCmd: PPTPCmd; isQueued: Boolean; queuedCmdIndex: puint64 ): Integer; cdecl;

...

implementation

...

  //extern "C" int SetPTPCmd(PTPCmd *ptpCmd, bool isQueued, uint64_t *queuedCmdIndex);
  function SetPTPCmd ( ptpCmd: PPTPCmd; isQueued: Boolean; queuedCmdIndex: puint64 ): Integer;
  cdecl; external 'DobotDll.dll';

...

end.
...ist da irgendwo ein Fehler?

Danke für Hinweise

Grüße
Angehängte Dateien
Dateityp: rar Delphi_DobotInterface.rar (4,04 MB, 5x aufgerufen)
Wissen ist Macht. Das ändert aber so gut wie nichts an der Übermacht der Dummheit.
  Mit Zitat antworten Zitat