2010-09-22 25 views
5

Tengo un programa Delphi 2007, que llama a un DLL de Delphi 2010. El programa es grande y todavía no se ha migrado al 2010, por lo que no hay manera de que pueda cambiar esto ahora mismo.comportamiento extraño con la cadena de llamada DLL

utilizo Unidad SimpleShareMem a pasar cadenas, pero también trató con sharemem borlndmm.dll.

Para una función que ahora pasa una cadena desde el Programm Delphi 2007 a la DLL (tanto AnsiString). Al depurar el dll, este AnsiString parece normal y se puede ver en la lista de observación. Pero si hago una reflexión simple como

AnAnsiString := PassedAnsiString; 

la AnAnsistring variable obtiene el valor '???????'#0#0#0'???A', pero PassedAnsiString sigue siendo legible en la lista. También una cadena anexa como

AnAnsiString := PassedAnsiString + NotPassedAnsiString; 

usa '???????'#0#0#0'???A' como valor.

¿Dónde está el problema? ¿Es un 2007 < -> 2010 problema? ¿Como arreglarlo? Gracias por ayuda.

Respuesta

5

Esto es probablemente debido a un campo de codificación que se añadió a AnsiString en D2009. IOW el registro (TAnsiRec) en el desplazamiento negativo del puntero ansistring es diferente y se desplaza entre Delphi unicode y no unicode (¡ansistring cambiado también en versiones unicode!)

No creo que haya una solución decente para esto, excepto que caiga volver a p (ANSI) nivel Char

+7

hecho; Los límites de DLL solo son seguros para tipos que no son específicos de Delphi. El intercambio de tipos específicos de Delphi a través de fronteras DLL sólo funciona cuando las representaciones binarias subyacentes de estos tipos son los mismos en ambos lados de la frontera. A partir de Delphi 2009, la representación binaria de AnsiString cambió, por lo que ya no es compatible con versiones anteriores de Delphi. –

+0

Y si el administrador de memoria es el mismo. –