Foros Club Delphi

Foros Club Delphi (https://www.clubdelphi.com/foros/index.php)
-   Varios (https://www.clubdelphi.com/foros/forumdisplay.php?f=11)
-   -   ayuda con shortstring de Delphi en C++ (https://www.clubdelphi.com/foros/showthread.php?t=34173)

HAL9000 30-07-2006 21:28:24

ayuda con shortstring de Delphi en C++
 
Hola a todos:

Soy nuevo en el foro y he ingresado exclusivamente para preguntar una duda.
Vereis, no soy programador de Delphi ni de Pascal (Aunque si de Modula2...) y necesito usar una "dll" escrita en Delphi en un programa en C++.

El caso es que en la "dll" se hace uso del tipo shortstring y no consigo ni bien ni mal hacer que que mis cadenas de C++ funcionen como shortstring.

Se que el Borland C++ Builder da soporte directo para este tipo de cadenas, pero yo estoy empleando MS Visual studio 2005.

¿Alguien puede ayudarme a definir un tipo shortstring en C++?
Hasta ahora se que el shortstring es una cadena de 256 caracteres y que en el primero se almacena la longitud de la cadena. Lo que no sé es si termina en cero (imagino que no) y como están rellenos el resto de caracteres de la cadena (imagino que son nulos).

El caso es que he probado ambas combinaciones y no consigo hacer que funcione.

Si alguien programa en C++ adjunto el código de mi programa (casca la función setBSCpath() ):

Código:


char ruta[256];
ruta[0]=3;
ruta[1]='C';
ruta[2]=':';
ruta[3]='\\';
micatalogo.SetBSCpath(ruta);


y también adjunto la especificacion e implementación de la función de la "dll" en Delphi:

Código:


procedure SetBSCpath(path : shortstring); stdcall;


Código:


procedure SetBSCpath(path : shortstring);
var i : integer;
begin
if path<>Bscpath then for i:=1 to CacheNum do cachelst[i]:=0;
BSCpath:=path;
end;


Un saludo a todos y muchas gracias a los respondones.

seoane 30-07-2006 23:54:37

A lo mejor te puedo ayudar con un ejemplo:

Si tenemos en una librería hecha en Delphi esta función:
Código Delphi [-]
procedure Mensaje(Str: ShortString); stdcall;
var
  s: string;
begin
  s:= 'El mensaje es: ' + Str;
  MessageBox(0,PChar(S),'Hola',0);
end;

Podemos hacer un pequeño programa en C que la utilice de la siguiente manera:
Código:

#include <stdio.h>
#include <windows.h>

typedef int (*MYPROC)(char *str);

int main(int argc, char *argv[])
{
 HINSTANCE hinstLib;
 MYPROC ProcAdd;
 char s[256];
 
 strcpy(&s[1], "Hola mundo");
 s[0] = strlen(&s[1]);
 
 hinstLib = LoadLibrary("libreria.dll");
 if (hinstLib != NULL)
 {
  ProcAdd = (MYPROC) GetProcAddress(hinstLib, "Mensaje");
  if (ProcAdd != NULL)
    (ProcAdd) (s);
  else
    printf("No puedo cargar la libreria\n");
    FreeLibrary(hinstLib);
 }
 return 0;
}


HAL9000 01-08-2006 01:05:10

¡¡SOLUCIONADO!!

Gracias Seoane. Indirectamente me has ayudado muchísismo.
Tras ver tu post decidí verificar si la implementación de las llamadas a la "dll" estaba hecho correctamente (era un archivo distribuido junto a la dll y al fichero de encabezamientos) y voila... no existía implementación de la función setBSCPath()... aunque si estaba el prototipo en el header.

Ya me funciona correctamente, muchas gracias de nuevo.


La franja horaria es GMT +2. Ahora son las 18:02:29.

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