Exportar tipos de dados via DLL
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
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
Curtidas 0
Melhor post
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
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
08/07/2005
Sobe
GOSTEI 0
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++
Definições em Delphi:
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:
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
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.
Abraços.
GOSTEI 0
Kapak
08/07/2005
Poste a definição da função e dos parâmetros em C++ e Delphi.
GOSTEI 0
Tnaires
08/07/2005
OK
Definições em C:
Definições equivalentes em Delphi:
É isso.
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
08/07/2005
E as definições da função ?
[/code]
[/code]
GOSTEI 0
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
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