Thank you for the always rapid and gentile reply. Well, if there's no way to avoid pchar, let's go to pchar!
2015-06-06 4:27 GMT-03:00, Michael Van Canneyt <mich...@freepascal.org>: > > > On Sat, 6 Jun 2015, luciano de souza wrote: > >> Hello all, >> >> At work, I need to create a Excel sheet containing certain more >> complex functions. I tried to use only VBA, but I released I will more >> productive if I could use a DLL writen in Pascal for the heavier code. >> >> Let see this DLL: >> >> library test; >> {$mode objfpc}{$H+} >> >> function concatenate(name: string): string; cdecl; >> begin >> result := 'Freepascal ' + name; >> end; >> >> function first(names: array of string):string; cdecl; // Warning: >> cdecl'ared functions have no high parameter > > I very much doubt VBA understands the 'array of string' concept. > It is typical for pascal. > >> begin >> result := names[0]; >> end; >> >> exports >> concatenate; >> first; >> end. >> >> The compiler also raised this error: "test.pas(10,1) Fatal: Internal >> error 201003031". >> >> I don't know what I am doing wrong. But actually, the reason of my >> message started from another point. >> >> Freepascal codes works with strings as usual. DLLs works with pchar. I >> could have declared the functions as the following: >> >> function concatenate(name: pchar): pchar; cdecl; >> function first(names: array of pchar): pchar; cdecl; > > I think you need to use stdcall calling convention. > >> >> In the body of the functions, I would treat the conversions from pchar >> to string and from string to pchar again. But, when I used "cdecl", am >> I making this conversion automatically? Is there a compilation switch >> that allows me to write strings and the compiled code having correctly >> treated the allocations and disallocation of strings? > > No, there is not. > >> >> Suppose this VBA code: >> >> public declare function concatenate lib "test" (name as string) as string >> >> Is this the correct way to write the called function in Freepascal? >> >> function concatenate(name: string): string; cdecl; >> begin >> result := 'Freepascal ' + name; >> end; > > No, IMHO you will need to use pchar everywhere. > > Michael. > _______________________________________________ > fpc-pascal maillist - fpc-pascal@lists.freepascal.org > http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal > -- Luciano de Souza _______________________________________________ fpc-pascal maillist - fpc-pascal@lists.freepascal.org http://lists.freepascal.org/cgi-bin/mailman/listinfo/fpc-pascal