Ir al contenido


Foto

Obtener valor desde una DLL


  • Por favor identifícate para responder
2 respuestas en este tema

#1 bigleaguer

bigleaguer

    Advanced Member

  • Miembros
  • PipPipPip
  • 66 mensajes

Escrito 07 mayo 2013 - 02:44

Saludos compañeros,

Estoy desarrollando una aplicación para un Data Collector con SO Windows Mobile 6.5 y el problema que tengo es que al tratar de obtener un valor desde un método de la libreria, me salta el siguiente error:
bus error or misaligned data access.

Asi está documentado el método del que trato de obtener el valor:

[cpp]int mysql_get_data(char *pszElem, int nRow, int nColumn)[/cpp]

Asi lo estoy implementando en Pascal (Lazarus):


delphi
  1. function mysql_get_data(var pszElem: PChar; nRow, nColumn: Integer): Integer; stdcall; external 'MySQLMobile.dll';



y finalmente:


delphi
  1.   var
  2.     Data: PChar;
  3.     //Otras variables...
  4.   begin
  5.   if mysql_execute_query('SELECT descripcion FROM ...') = 0 then
  6.   begin
  7.     mysql_get_data(Data, 0, 0);
  8.     edtDescripcion.Text := Data; //<-- Aqui me genera el error
  9.   end; 

     

Agradezco mucho su ayuda y/o sugerencias.
  • 0

#2 escafandra

escafandra

    Advanced Member

  • Administrador
  • 4.107 mensajes
  • LocationMadrid - España

Escrito 07 mayo 2013 - 05:02

En C por defecto las funciones son cdecl no stdcall. Solo si te indican que usan el convenio stdcall debes usarlo.

char* es un PCHAR y tu estas pasando una referencia a un PCHAR.
Debes traducirlo así:


delphi
  1. function mysql_get_data(pszElem: PChar; nRow, nColumn: Integer): Integer; cdecl; external 'MySQLMobile.dll';



Si falla, es posible que usen el convenio stdcall, pruebalo, entonces.

Saludos.
  • 0

#3 bigleaguer

bigleaguer

    Advanced Member

  • Miembros
  • PipPipPip
  • 66 mensajes

Escrito 08 mayo 2013 - 09:21

Muchas gracias escafandra, tal como comentas el problema era que estaba pasando una referencia a un PChar.

Declare el método de la siguiente forma:



delphi
  1. function mysql_get_data(pszElem: PChar; nRow, nColumn: Integer): Integer; stdcall; external 'MySQLMobile.dll';



y el código quedó parecido a esto:



delphi
  1. var
  2.   Data: PChar;
  3. begin
  4.   if mysql_execute_query('SELECT descripcion FROM ...') = 0 then
  5.   begin
  6.     Data := StrAlloc(8192); // Asigno un buffer de 8k
  7.     mysql_get_data(Data, 0, 0);
  8.     edtDescripcion.Text := Data;
  9.     StrDispose(Data);
  10.   end;



Doy el tema como Resuelto.
  • 0




IP.Board spam blocked by CleanTalk.