Ir para conteúdo
  • Cadastre-se

dev botao

  • Este tópico foi criado há 4887 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Recommended Posts

Postado

Onde o define para convenção de chamada STDCALL do Acbr32.dll? Já dei find in sources na base

de código inteira, e nem sinal. O arquivo de importação do C# está usando cdecl para

importar e isso está dando pau direto pois a DLL está sendo compilada como STDCALL.

Ambiente (nativo):

Lazarus 0.9.30

Ambiente (dotNet):

Visual Studio 2010 (C#)

Postado

Oi Fabrício,

Cara, a ACBrDLL possui os defines pra compilar tanto em STDCALL quanto em CDECL. No Delphi, na propriedade do projeto vc coloca os defines usados na compilação.

Até agora estamos fazendo assim:

A compilação "default" é em CDECL pra funcionar mais facilmente para criar o .lib (a biblioteca de vínculo estático, usada pra compilar os programas em C; Não confundir com a .lib usada em linux)

Funcionaria em STDCALL, mas a diferença básica entre um método de chamada e o outro, é que o STDCALL deixa a cargo da linguagem que fez a chamada realizar a limpeza da pilha de memória dos parâmetros usados, enquanto a CDECL deixa a cargo da DLL fazer isso.

Pra usar STDCALL teria que fazer um trabalhinho extra em colocar e manter o tamanho dos parâmetros na definição da .lib. Até onde eu sei o Delphi não compila uma .lib, então esse processo de criá-la é bem manual.

Como tenho planos em compilar ela pra linux e rodar em Java e Mono, acho que o CDECL vai ser o caminho mais natural, acho que o linux não suporta o STDCALL.

O VB6, FOXPRO, e outras linguagens não fazem chamadas em CDECL, aí temos que manter uma versão da DLL em STDCALL pra elas.

****

No seu caso, é só colocar o CDECL nos defines do projeto e compilar, mantendo o CDECL no C#.

Qualquer dúvida, estamos aí.

Abs,

Rafael Batiati

ACBrFramework - Automação comercial para todos.

MultiClubes - Soluções para a área de clubes, parques, lazer e entretenimento.

Postado

Oi Fabrício,

Cara, a ACBrDLL possui os defines pra compilar tanto em STDCALL quanto em CDECL. No Delphi, na propriedade do projeto vc coloca os defines usados na compilação.

Não fui claro, pelo visto. Eu não sei xongas de Lazarus (que é o que posso usar aqui), e não tenho Delphi (quem dera :roll:) onde eu estou usando a ACBr - entao estou usando Lazarus.

E outra: o ACBr32.dll já está com o símbolo STDCALL definido.

Coloquei um $UNDEF para remover o símbolo (gambiarra) - porque não achei onde essa goiaba está definida. O "Find in Files..." do Lazarus nada encontrou - de todas as linhas (10000+) onde existe um STDCall definido na ACBr, nenhuma delas é um $DEFINE.

Como eu não quero bagunçar o coreto, onde está esse {$DEFINE STDCALL} para que eu possa comentá-lo e fazer a alteração da maneira que foi imaginada por vocês?

Postado

Hehehe,

Você não sabe xongas, e eu não sei milongas!!! Vergonhoso, admito, mas só sei o básico de object pascal e da IDE do Delphi.

Mas você está certo, não há $DEFINE em lugar nenhum do código, esses defines são feitos nas propriedades do projeto (em Delphi), e admito (vergonhoso novamente), eu não achei a tela equivalente na IDE do Lazarus.

O que precisa fazer é remover o STDCALL dos defines e colocar o CDECL em seu lugar.

Quer que eu compile a DLL em CDECL e te envie em quanto isso?

Daniel, pode nos ajudar com o Lazarus?

Abs!

Rafael Batiati

ACBrFramework - Automação comercial para todos.

MultiClubes - Soluções para a área de clubes, parques, lazer e entretenimento.

Postado

Hehehe,

Você não sabe xongas, e eu não sei milongas!!! Vergonhoso, admito, mas só sei o básico de object pascal e da IDE do Delphi.

Mas você está certo, não há $DEFINE em lugar nenhum do código, esses defines são feitos nas propriedades do projeto (em Delphi), e admito (vergonhoso novamente), eu não achei a tela equivalente na IDE do Lazarus.

O que precisa fazer é remover o STDCALL dos defines e colocar o CDECL em seu lugar.

Quer que eu compile a DLL em CDECL e te envie em quanto isso?

Daniel, pode nos ajudar com o Lazarus?

Abs!

Então somos dois perdidos. :lol: No meu note, eu tenho delphi - mas no ambiente de trabalho onde eu estou usando ACBr preciso usar Lazarus (trabalho em 2 lugares, um usa Delphi e outro dotNet - o Lazarus está no trabalho em dotNet).

Hoje estou escrevendo do note. Sugiro tirar esse $DEFINE STDCALL da propriedade do projeto e criar um ACBR32DLL.INC (tal como existe no ACBr principal).

Até lá, me viro com o $UNDEF no arquivo lpr - parece que todo o projeto está seguindo, não preciso copiar isso em todos os fontes da DLL.

  • Este tópico foi criado há 4887 dias atrás.
  • Talvez seja melhor você criar um NOVO TÓPICO do que postar uma resposta aqui.

Crie uma conta ou entre para comentar

Você precisar ser um membro para fazer um comentário

Criar uma conta

Crie uma nova conta em nossa comunidade. É fácil!

Crie uma nova conta

Entrar

Já tem uma conta? Faça o login.

Entrar Agora
×
×
  • Criar Novo...

Informação Importante

Colocamos cookies em seu dispositivo para ajudar a tornar este site melhor. Você pode ajustar suas configurações de cookies, caso contrário, assumiremos que você está bem para continuar.