Is there a difference in the way that strings are passed between an application written in Delphi 1.0 and a DLL and between an application written in Delphi 3.0 and a DLL? For example, are the strings in Delphi 3.0 null terminated?
Yes, there is a definite difference between strings in Delphi 1.0 and Delphi 3.0. Delphi 1.0 strings are traditionally ShortStrings--nothing more than character arrays of 256 bytes. Delphi 2.0 (and later versions) strings are AnsiStrings, which are actually pointers to null-terminated strings. Furthermore, AnsiStrings have a negative offset that contains the "length code" as opposed to ShortStrings that have a zero-offset that contains the "length byte." What does this mean? Well, the length code of an AnsiString is a 32-bit code, which means that it can be as large as 4GB. AnsiStrings in Win32 can be as large as that. On the other hand, since the length byte of a ShortString is only 8-bits, the largest value it can be is 256. So there are fundamental differences between strings in version 1 and 2+. Based on what I explained above, the Delphi 3.0 string is not really null-terminated. However, the data that the string pointer variable points to is null-terminated. So to answer your question, strings passed in an application written in the different versions of Delphi are handled differently by virtue of their very different natures.