Exportar tipos de dados via DLL

Delphi

08/07/2005

Olá pessoal.
Desde já agradeço a paciência pra ler esse texto.
Estou querendo terminar um trabalho na faculdade que envolve integração entre C e Delphi via DLL (a DLL é gerada a partir de uma biblioteca escrita em C). Eu já consegui gerar a DLL a partir do Dev-C++. Mas tô com um problema q não sei se tem solução.
Se minha biblioteca tivesse apenas funções independentes, o problema estaria resolvido. Mas ela possui tipos de dados definidos através da instrução [b:a9420cd2f3]typedef[/b:a9420cd2f3] (semelhante à instrução type do Pascal), e as funções trabalham em cima desse tipo de dado. Uma função cria uma instância, outras recebem uma instância, mudam seus atributos e a retornam, outra função libera da memória, etc.
Minha dúvida é: há alguma maneira de exportar tipos de dados definidos pelo programador através de uma DLL, da mesma maneira q nós exportamos funções definidas?
Os moderadores do fórum podem achar q esta é uma dúvida q deveria ser postada no fórum C/C++. Se for o caso, por favor movam o tópico. Mas enfocando no Delphi, será q há alguma maneira d exportar uma definição de classe ( ou record, etc ) efetuada dentro d uma DLL?
Abraços


Tnaires

Tnaires

Curtidas 0

Melhor post

Tnaires

Tnaires

09/07/2005

Olá
Redefini os ponteiros pras estruturas no Delphi, mas qdo executo a função da dll, o programa mostra um erro ´Privileged Instruction´.
Alguém sabe o q pode ser?
Abraços


GOSTEI 1

Mais Respostas

Tnaires

Tnaires

08/07/2005

Sobe


GOSTEI 0
Kapak

Kapak

08/07/2005

Até onde sei uma dll só exporta métodos e funções.
Seu problema é a conversão das estruturas em C++ p/ Delphi ?
Se for, não é muito complicado. Segue um exemplo, veja se pode ajudar:

Definições em C++
typedef uint32 BioAPI_RETURN;
typedef uint32 BioAPI_HANDLE, *BioAPI_HANDLE_PTR;
typedef sint32 BioAPI_BIR_HANDLE, *BioAPI_BIR_HANDLE_PTR;
typedef uint8 BioAPI_BIR_VERSION, *BioAPI_BIR_VERSION_PTR;
typedef uint8 BioAPI_BIR_DATA_TYPE;
typedef struct bioapi_bir_biometric_data_format {
  uint16 FormatOwner;
  uint16 FormatID;
  } BioAPI_BIR_BIOMETRIC_DATA_FORMAT, *BioAPI_BIR_BIOMETRIC_DATA_FORMAT_PTR;
typedef sint8 BioAPI_QUALITY;
typedef uint8 BioAPI_BIR_PURPOSE;
typedef uint32 BioAPI_BIR_AUTH_FACTORS;
typedef struct bioapi_bir_header {
  uint32 Length;
  BioAPI_BIR_VERSION HeaderVersion;
  BioAPI_BIR_DATA_TYPE Type;
  BioAPI_BIR_BIOMETRIC_DATA_FORMAT Format;
  BioAPI_QUALITY Quality;
  BioAPI_BIR_PURPOSE PurposeMask;
  BioAPI_BIR_AUTH_FACTORS FactorsMask;
  } BioAPI_BIR_HEADER, *BioAPI_BIR_HEADER_PTR;

// Chamada da função
BioAPI_RETURN BioAPI BioAPI_GetHeaderFromHandle
 (BioAPI_HANDLE ModuleHandle,
  BioAPI_BIR_HANDLE Handle,
  BioAPI_BIR_HEADER_PTR Header);

Definições em Delphi:
type BioAPI_RETURN          = LongWord;
     BioAPI_HANDLE          = THandle;
     BioAPI_HANDLE_PTR      = ^BioAPI_HANDLE;
     BioAPI_BIR_HANDLE      = Integer;
     BioAPI_BIR_HANDLE_PTR  = ^BioAPI_BIR_HANDLE;
     BioAPI_BIR_VERSION     = Byte;
     BioAPI_BIR_VERSION_PTR = ^BioAPI_BIR_VERSION;
     BioAPI_BIR_DATA_TYPE = Byte;
type BioAPI_BIR_BIOMETRIC_DATA_FORMAT = record
       FormatOwner :Word;
       FormatID    :Word;
end;
type BioAPI_QUALITY = byte;
     BioAPI_BIR_PURPOSE = byte;
     BioAPI_BIR_AUTH_FACTORS = LongWord;
     BioAPI_BIR_HEADER_PTR = ^BioAPI_BIR_HEADER;
type BioAPI_BIR_HEADER = record
       Length        :LongWord;
       HeaderVersion :BioAPI_BIR_VERSION;
       Tipo          :BioAPI_BIR_DATA_TYPE;
       Format        :BioAPI_BIR_BIOMETRIC_DATA_FORMAT;
       Quality       :BioAPI_BIR_QUALITY;
       PurposeMask   :BioAPI_BIR_PURPOSE;
       FactorsMask   :BioAPI_BIR_AUTH_FACTORS;
end;

// Chamada da função
function BioAPI_GetHeaderFromHandle(ModuleHandle :BioAPI_HANDLE;
                                    Handle       :BioAPI_BIR_HANDLE;
                                    Header       :BioAPI_BIR_HEADER_PTR): BioAPI_RETURN; stdcall;


Note que o parâmetro [b:3103a6cc43]Header[/b:3103a6cc43] é um ponteiro p/ uma estrutura de dados que possui outra estrutura em [b:3103a6cc43]Format[/b:3103a6cc43].
A chamada original da função em C++ manda o ponteiro da estrutura, mas vc poderia passar essa estrutura em Delphi por referência:
function BioAPI_GetHeaderFromHandle(ModuleHandle :BioAPI_HANDLE;
                                    Handle       :BioAPI_BIR_HANDLE;
                                --> var Header   :BioAPI_BIR_HEADER): BioAPI_RETURN; stdcall;



GOSTEI 0
Tnaires

Tnaires

08/07/2005

Obrigado kapak, vc pegou logo na veia do problema! É exatamente isso: as funções trabalham com ponteiros pra estruturas definidas da linguagem C. Vou testar sua alternativa.
Abraços.


GOSTEI 0
Kapak

Kapak

08/07/2005

Poste a definição da função e dos parâmetros em C++ e Delphi.


GOSTEI 0
Tnaires

Tnaires

08/07/2005

OK
Definições em C:
typedef enum {RUBRO, NEGRO} cor;

typedef struct no
{
struct no *esquerda, *direita, *pai;
cor color;
char *palavra;


} *NoRubroNegro;

typedef struct arn
{
struct no *raiz, *nulo ;

} *ArvoreRubroNegra;

Definições equivalentes em Delphi:
type
  cor = (RUBRO, NEGRO);

  NoRubroNegro = ^no;
  ArvoreRubroNegra = ^arn;

  no = record
    esquerda, direita, pai: NoRubroNegro;
    color: cor;
    palavra: PChar;
  end;

  arn = record
    raiz, nulo: NoRubroNegro;
  end;

É isso.


GOSTEI 0
Kapak

Kapak

08/07/2005

E as definições da função ?
[/code]


GOSTEI 0
Tnaires

Tnaires

08/07/2005

Olá
kapak, desculpe a demora. Fiquei impossibilitado de acessar a internet por um tempo. Qto ao trabalho, não precisa mais, pois falamos com o professor e fizemos em Visual C++. Obrigado pela ajuda.
Abraços


GOSTEI 0
POSTAR