Have you tried using cdecl or stdcall instead of cppdecl ?
My lazarus source
unit Unit1;
{$mode objfpc}{$H+}
{$ifdef unix}
{$linklib myfunc}
{$endif}
interface
uses
Classes, SysUtils, FileUtil, LResources, Forms, Controls, Graphics, Dialogs,
ExtCtrls, StdCtrls;
type
{ TForm1 }
TForm1 = class(TForm)
Button1: TButton;
Edit1: TEdit;
procedure Button1Click(Sender: TObject);
private
{ private declarations }
public
{ public declarations }
end;
PtrListaODBC=^appoggio;
Appoggio = record
dsn : array[0..255] of char;
desc : array[0..255] of char;
next: PtrListaODBC;
end;
var
Form1: TForm1;
//function GetListaDSN(MiaLista: PtrListaODBC): PChar; cdecl; external {$ifdef windows} 'ProgettoDLLODBC.dll'{$endif};
function MaxDSN(): integer;cppdecl; external {$ifdef windows} 'ProgettoDLLODBC.dll'{$endif};
function GetDSN (num: integer): PChar;cppdecl; external {$ifdef windows} 'ProgettoDLLODBC.dll'{$endif};
function GetDescDSN (num: integer): PChar;cppdecl; external {$ifdef windows} 'ProgettoDLLODBC.dll'{$endif};
procedure LiberaStringa (var val: PChar);cppdecl; external {$ifdef windows} 'ProgettoDLLODBC.dll'{$endif};
function MaxTabelle(Dsn: PChar; Uid: PChar; Pwd: PChar): integer;cppdecl; external {$ifdef windows} 'ProgettoDLLODBC.dll'{$endif};
function GetNomeTabella(Dsn: PChar; Uid: PChar; Pwd: PChar; num: integer): PChar;cppdecl; external {$ifdef windows} 'ProgettoDLLODBC.dll'{$endif};
implementation
{ TForm1 }
procedure TForm1.Button1Click(Sender: TObject);
var
app: PtrListaODBC;
i: integer;
MioDsn: Pchar;
MiaDesc: PChar;
MiaTab: PChar;
begin
i:=0;
for i:=1 to MaxDSN() do
begin
MioDSN:=GetDSN(i);
MiaDesc:=GetDescDSN(i);
ShowMessage(IntToStr(i) + ' ' + MioDSN + ' [' + MiaDesc + ']');
LiberaStringa(MioDSN);
LiberaStringa(MiaDesc);
end;
for i:=1 to MaxTabelle('MySql_Locale','mycinema','mycinema') do
begin
MiaTab:=GetNomeTabella('MySql_Locale','mycinema','mycinema',i);
ShowMessage(IntToStr(i) + ' ' + MiaTab);
end;
end;
initialization
{$I unit1.lrs}
end.
My DEV CPP dll source
#include <windows.h>
#include <stdio.h>
#include "MyODBCLib.h"
EXTERN_C __declspec(dllexport) INT MaxDSN ();
EXTERN_C __declspec(dllexport) INT MaxTabelle (char * Dsn, char * Uid, char * Pwd);
EXTERN_C __declspec(dllexport) VOID GetDSNNum (INT num , CHAR * Dsn,CHAR * Desc);
EXTERN_C __declspec(dllexport) char * GetDSN (INT num);
EXTERN_C __declspec(dllexport) VOID LiberaStringa(char ** val);
EXTERN_C __declspec(dllexport) char * GetNomeTabella (char * Dsn, char * Uid, char * Pwd, INT num);
BOOL WINAPI __declspec(dllexport) LibMain (HINSTANCE hInst, DWORD Reason, LPVOID Reserved)
{
if(Reason==DLL_PROCESS_ATTACH)
{
return TRUE;
}
if(Reason==DLL_PROCESS_DETACH)
{
return TRUE;
}
return FALSE;
}
EXTERN_C __declspec(dllexport) INT MaxDSN ()
{
PtrListaODBC * MiaLista;
PtrListaODBC * app;
int ret;
MiaLista=RecuperaListaODBC();
app=MiaLista;
ret=0;
while(app)
{
ret++;
app=app->next;
}
CancellaListaODBC(MiaLista);
return ret;
}
EXTERN_C __declspec(dllexport) INT MaxTabelle (char * Dsn, char * Uid, char * Pwd)
{
PtrDatiODBC * MieiDati; //contiene i dati per collegarsi al oDBC
PtrListaTabelle * MieTabelle;
PtrListaTabelle * app;
char * strconn;
int ret;
strconn=(char*)malloc(sizeof(char)*(1+strlen(Dsn)+strlen(Uid)+strlen(Pwd)+strlen("DSN=;UID=;PWD=;")));
strcpy(strconn,"DSN=");
strcat(strconn,Dsn);
strcat(strconn,";UID=");
strcat(strconn,Uid);
strcat(strconn,";PWD=");
strcat(strconn,Pwd);
strcat(strconn,";");
//MieiDati=ApriConnessioneODBC((SQLCHAR*)"DSN=MySql_Locale;UID=mycinema;PWD=mycinema;");
MieiDati=ApriConnessioneODBC((SQLCHAR*)strconn);
free(strconn);
MieTabelle=RecuperaListaTabelle(MieiDati);
app=MieTabelle;
ret=0;
while(app)
{
//printf("%s - %s\n", app->dsn, app->desc);
ret++;
app=app->next;
}
CancellaListaTabelle(MieTabelle);
DisconnettiODBC(MieiDati); //mi disconnetto
return ret;
}
EXTERN_C __declspec(dllexport) VOID GetDSNNum (INT num , char * Dsn, char * Desc)
{
PtrListaODBC * MiaLista;
PtrListaODBC * app;
int ret, i;
char * val1, *val2;
MiaLista=RecuperaListaODBC();
app=MiaLista;
i=0;
while(app)
{
//printf("%s - %s\n", app->dsn, app->desc);
i++;
if (i==num)
{
val1=(char*)malloc(sizeof(char)*strlen(app->dsn));
strcpy(val1,app->dsn);
val2=(char*)malloc(sizeof(char)*strlen(app->desc));
strcpy(val2,app->desc);
Dsn=val1;
Desc=val2;
}
app=app->next;
}
CancellaListaODBC(MiaLista);
}
EXTERN_C __declspec(dllexport) char * GetDSN (INT num)
{
PtrListaODBC * MiaLista;
PtrListaODBC * app;
char * ret;
int i;
MiaLista=RecuperaListaODBC();
app=MiaLista;
i=0;
while(app)
{
//printf("%s - %s\n", app->dsn, app->desc);
i++;
if (i==num)
{
ret=(char*)malloc(sizeof(char)*strlen(app->dsn));
strcpy(ret,app->dsn);
}
app=app->next;
}
CancellaListaODBC(MiaLista);
return ret;
}
EXTERN_C __declspec(dllexport) char * GetDescDSN (INT num)
{
PtrListaODBC * MiaLista;
PtrListaODBC * app;
char * ret;
int i;
MiaLista=RecuperaListaODBC();
app=MiaLista;
i=0;
while(app)
{
//printf("%s - %s\n", app->dsn, app->desc);
i++;
if (i==num)
{
ret=(char*)malloc(sizeof(char)*strlen(app->desc));
strcpy(ret,app->desc);
}
app=app->next;
}
CancellaListaODBC(MiaLista);
return ret;
}
EXTERN_C __declspec(dllexport) char * GetNomeTabella (char * Dsn, char * Uid, char * Pwd, INT num)
{
PtrDatiODBC * MieiDati; //contiene i dati per collegarsi al oDBC
PtrListaTabelle * MieTabelle;
PtrListaTabelle * app;
char * strconn;
int i;
char * ret;
strconn=(char*)malloc(sizeof(char)*(1+strlen(Dsn)+strlen(Uid)+strlen(Pwd)+strlen("DSN=;UID=;PWD=;")));
strcpy(strconn,"DSN=");
strcat(strconn,Dsn);
strcat(strconn,";UID=");
strcat(strconn,Uid);
strcat(strconn,";PWD=");
strcat(strconn,Pwd);
strcat(strconn,";");
//MieiDati=ApriConnessioneODBC((SQLCHAR*)"DSN=MySql_Locale;UID=mycinema;PWD=mycinema;");
MieiDati=ApriConnessioneODBC((SQLCHAR*)strconn);
free(strconn);
MieTabelle=RecuperaListaTabelle(MieiDati);
app=MieTabelle;
ret=NULL;
i=0;
while(app)
{
//printf("%s - %s\n", app->dsn, app->desc);
i++;
if (i==num)
{
ret=(char*)malloc(sizeof(char)*strlen(app->nome));
strcpy(ret,app->nome);
}
app=app->next;
}
CancellaListaTabelle(MieTabelle);
DisconnettiODBC(MieiDati); //mi disconnetto
return ret;
}
EXTERN_C __declspec(dllexport) VOID LiberaStringa(char ** val)
{
free(val);
}
If I comment a free function the program not return a sigsev error.