Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Otros entornos y lenguajes > C++ Builder
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 28-03-2022
Avatar de cesarsoftware
cesarsoftware cesarsoftware is offline
Miembro
 
Registrado: nov 2006
Posts: 241
Poder: 18
cesarsoftware Va por buen camino
Smile Funcion en DLL pasar de C++ a Delphi

Hola compañeros.
Estoy tratando de trasladar un codigo escrito en C++ que llama a funciones de una DLL a Delphi. El procedimiento basico esta hecho pero no comprendo o no se bien como pasar los parametros,
Escribo el codigo C++
Código:
struct MELDEVICEDATA
DWORD dwDeviceType; /* Device type (Set DEVICETYPE_TCP.) */
APIDEVICE uniDeviceInfo; /* Device information */

struct APIDEVICE
struct Tcp
char IPAddr[16]; /* IP address (e.g. “192.168.100.1”) */
long lPortNo; /* Port No. (Set 683 (fixed value).) */
char dummy[12]; /* Reserved */

DWORD WINAPI melIoctl( HWND hWnd, long lAddress, long lFunction, LPVOID lpData ); ): Longint; stdcall; /* function in DLL */

void setmachine; {
/* Set IP address */
MELDEVICEDATA MelIoctlData;
long lIPAdrLen;
char szIPAddress[] = "192.168.100.1";
DWORD dwStatus;
/* Set device type */
melIoctlData.dwDeviceType = DEVICETYPE_TCP;
/* Set IP address */
lIPAdrLen = strlen(szIPAddress);
strncpy(MelIoctlData.uniDeviceInfo.Tcp.IPAddr, szIPAddress, lIPAdrLen);
melIoctlData.uniDeviceInfo.Tcp.IPAddr[lIPAdrLen] = '\0';
/* Set port No. */
MelIoctlData.uniDeviceInfo.Tcp.lPortNo = 683;
dwStatus = melIoctl(NULL, ADR_MACHINE(1), DEV_SET_COMMADDRESS, &MelIoctlData);
}
Y ahora el codigo Delphi que casi seguro no esta bien.
Código Delphi [-]
type APIDEVICE = record
  IPAddr: ansistring;             // IP address (e.g. “192.168.100.1”)
  lPortNo: word;                  // Port No. (Set 683 (fixed value).)
  dummy: array[0..11] of UINT16;  // array of supported bus controllers
end;

type MELDEVICEDATA = packed record
  dwDeviceType: LongWord;         // Device type (Set DEVICETYPE_TCP.)
  uniDeviceInfo: APIDEVICE;       // Device information
end;

type tMELDEVICEDATA = ^MELDEVICEDATA;

function melIoctl(HWND, lAddress, lFunction: LongWord; lpData: Pointer): LongWord; cdecl; stdcall; external 'ncap.iDLL';

procedure TForm1.BotonProbarClick(Sender: TObject);
var
  MelIoctlData: tMELDEVICEDATA;
  szIPAddress: ansistring;
  dwStatus: LongWord;
begin
  StaticText1.Caption := '';
  StaticText1.Update;
  New(MelIoctlData);
  szIPAddress := AnsiString(EditCncIP.Text);
  MelIoctlData^.dwDeviceType := DEVICETYPE_TCP;
  MelIoctlData^.uniDeviceInfo.IPAddr := szIPAddress;
  MelIoctlData^.uniDeviceInfo.lPortNo := 683;
  dwStatus := melIoctl(Self.Handle, ADR_MACHINE, DEV_SET_COMMADDRESS, tMELDEVICEDATA(MelIoctlData));
//  function melIoctl(HWND: LongWord; var lAddress, lFunction: LongWord; const lpData: string): Longint; stdcall;
  StaticText1.Caption := IntToStr(dwStatus);
  if dwStatus = ME_SYSFUNC_IOCTL_ADDR then // Address error
    Beep
  else
  if dwStatus = ME_SYSFUNC_IOCTL_FUNCTION then // Function error
    Beep
  else
    Beep;
  Dispose(tMELDEVICEDATA(MelIoctlData));
end;

Si alguien es tan amable de ayudarme, lo agradecere ampliamente, cervezas incluidas
__________________
Disfruta de la vida ahora, vas a estar muerto mucho tiempo.
Responder Con Cita
  #2  
Antiguo 29-03-2022
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.275
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
Cita:
Empezado por cesarsoftware Ver Mensaje
Hola compañeros.
Estoy tratando de trasladar un codigo escrito en C++ que llama a funciones de una DLL a Delphi.
...
Y ahora el codigo Delphi que casi seguro no esta bien.
Tendías que explicar qué problema hay.
¿No compila? ¿No funciona en ejecución?

Aun así hay referencias en ese código que no están disponibles por lo que también es difícil probarlo (DEVICETYPE_TCP, por ejemplo).
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.

Última edición por Neftali [Germán.Estévez] fecha: 29-03-2022 a las 17:52:49.
Responder Con Cita
  #3  
Antiguo 29-03-2022
Avatar de cesarsoftware
cesarsoftware cesarsoftware is offline
Miembro
 
Registrado: nov 2006
Posts: 241
Poder: 18
cesarsoftware Va por buen camino
Smile

Buenas Netfali.
Que majo eres, siempre dispuesto a ayudar, Gracias.
El problema es que no se si es convertido bien la funcion, sobre todo por el tema del puntero a la estructura &MelIoctlData.
No da problema de compilacion, y la funcion me devuelve un error, con lo que en teoria, al menos, la libreria funciona y no "explota"
La constante DEVICETYPE_TCP debe estar en otro fichero que por cierto no encuentro, no se si sera un tipo fijo en algun include .H de linux.
De momento le he asignado un valor para salir del paso sabiendo que me falta esa constante.
Tambien veo que ADR_MACHINE es como un array para C++ pero como no se como pasarle ese "puntero" tambien he hecho mal y como es un longorwd le he puesto a 1 hasta aprender a mandarle ese tipo de array.
Las otras constantes si estan sacadas del manual del fabricante pero DEVICETYPE_TCP no esta en el manual y es un valor OBLIGADO Y NECESARIO por ellos. Algun dia lo encontrare o les llamare a los japaneses, jejeje.
Código Delphi [-]
const
  DEVICETYPE_TCP: word = 1;
  ADR_MACHINE: LongWord = 1;
  DEV_SET_COMMADDRESS: LongWord = $FFF;             // 4095
  ME_SYSFUNC_IOCTL_FUNCTION: LongWord = $80020132;  // Function error
  ME_SYSFUNC_IOCTL_ADDR: LongWord = $80020190;      // Address error
Como veras la funcion en C++ es:
Código:
dwStatus = melIoctl(NULL, ADR_MACHINE(1), DEV_SET_COMMADDRESS, &MelIoctlData);
Mi pregunta es, ¿asi esta bien convertida a Delphi?
Código Delphi [-]
dwStatus := melIoctl(Self.Handle, ADR_MACHINE, DEV_SET_COMMADDRESS, tMELDEVICEDATA(MelIoctlData));
¿He convertido bien las estructuras?
Código:
struct MELDEVICEDATA{
DWORD dwDeviceType; // Device type (Set DEVICETYPE_TCP.)
APIDEVICE uniDeviceInfo; // Device information
}
struct APIDEVICE {
struct Tcp {
char IPAddr[16]; // IP address (e.g. “192.168.100.1”)
long lPortNo; // Port No. (Set 683 (fixed value).)
char dummy[12]; // Reserved
}
}
Código Delphi [-]
type APIDEVICE = record
  IPAddr: ansistring;             // IP address (e.g. “192.168.100.1”)
  lPortNo: word;                  // Port No. (Set 683 (fixed value).)
  dummy: array[0..11] of UINT16;  // array of supported bus controllers
end;

type MELDEVICEDATA = packed record
  dwDeviceType: LongWord;         // Device type (Set DEVICETYPE_TCP.)
  uniDeviceInfo: APIDEVICE;       // Device information
end;

type tMELDEVICEDATA = ^MELDEVICEDATA;

Espero ansiosamente tus comentos. ;?
__________________
Disfruta de la vida ahora, vas a estar muerto mucho tiempo.

Última edición por cesarsoftware fecha: 29-03-2022 a las 12:56:38. Razón: Amplio la informacion de constantes
Responder Con Cita
  #4  
Antiguo 29-03-2022
Avatar de Neftali [Germán.Estévez]
Neftali [Germán.Estévez] Neftali [Germán.Estévez] is offline
[becario]
 
Registrado: jul 2004
Ubicación: Barcelona - España
Posts: 18.275
Poder: 10
Neftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en brutoNeftali [Germán.Estévez] Es un diamante en bruto
No soy especialista en C++.
Lo mueve al foro correspondiente a ver si alguien con más conocimientos te puede ayudar.

De todas formas un primer intento del que no te puedes fiar sería:

Código Delphi [-]
type
  PTcp = ^Tcp;
  PAPIDEVICE = ^APIDEVICE;
  PMELDEVICEDATA = ^MELDEVICEDATA;

  Tcp = record
    IPAddr: array [0..15] of Char;
    lPortNo: Integer;
    dummy: array [0..11] of Char;
  end;

  APIDEVICE = record
    ValueTcp: Tcp;
  end;

  MELDEVICEDATA = record
    dwDeviceType: Integer;
    uniDeviceInfo: APIDEVICE;
  end;
__________________
Germán Estévez => Web/Blog
Guía de estilo, Guía alternativa
Utiliza TAG's en tus mensajes.
Contactar con el Clubdelphi

P.D: Más tiempo dedicado a la pregunta=Mejores respuestas.

Última edición por Neftali [Germán.Estévez] fecha: 29-03-2022 a las 18:15:02.
Responder Con Cita
  #5  
Antiguo 29-03-2022
Avatar de cesarsoftware
cesarsoftware cesarsoftware is offline
Miembro
 
Registrado: nov 2006
Posts: 241
Poder: 18
cesarsoftware Va por buen camino
Gracias German

Espero la ayuda de los expertos.
Siento no pasar tanto por el foro como antes, tengo mucho trabajo, pero intentare pasar por aqui mas a menudo para echar una mano.
__________________
Disfruta de la vida ahora, vas a estar muerto mucho tiempo.
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
Problema al pasar función de D2007 a Berlín newtron Varios 9 15-06-2019 09:33:28
Pasar Esta Funcion de Calculo de edad a dll webmasterplc OOP 2 09-04-2014 12:23:22
Pasar Función de PL/pgSQL a SQL92 Zeta PostgreSQL 1 16-12-2010 16:43:47
pasar un puntero a una funcion baby Varios 2 21-05-2007 13:10:22
Pasar como parametro el where en una funcion cso2000 MS SQL Server 2 15-02-2005 02:49:47


La franja horaria es GMT +2. Ahora son las 15:21:10.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi