PDA

Ver la Versión Completa : ayuda con shortstring de Delphi en C++


HAL9000
30-07-2006, 21:28:24
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() ):


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:


procedure SetBSCpath(path : shortstring); stdcall;



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:

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:

#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.