Ir para conteúdo
Fórum Script Brasil
  • 0

Problema Com Dll


Guest - Ramalho -

Pergunta

Guest - Ramalho -

Pessoal,

Quando tento usar uma DLL feita em Delphi na plataforma .NET é apresentado o seguinte erro: "Não é um assembly ou um objeto COM válido", já no Delphi eu consigo usar a DLL sem problema nenhum. Qual o problema de usar uma DLL em Delphi na plataforma .NET?

Desde já agradeço.

Link para o comentário
Compartilhar em outros sites

11 respostass a esta questão

Posts Recomendados

  • 0

A DLL que você criou no Delphi não é do tipo COM (e nem é um Assembly .NET), então, você terá que declarar cada uma das funções (no caso do VB.NET você deve utilizar a instrução Declare). Qual a linguagem .NET que você está utilizando?

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0
Guest - Ramalho -

Graymalkin,

Estou usando VB.NET. Não devo usar a opção "Add Reference", você poderia detalhar como devo declarar/usar a DLL?

Desde já agradeço.

Link para o comentário
Compartilhar em outros sites

  • 0

Não, o "Add Reference" só serve para bibliotecas COM ou .NET. Para DLLs nativas você vai precisar ter suas funções explicitamente declaradas. Basicamente você vai precisar de algo assim:

Declare Function nomedafunção Lib "suaDLL.dll" Alias "nomedafunção" (parâmetros da função) As tipoderetorno

É claro que os parâmetros da função e o tipo de retorno devem ser tipos equivalentes aos que você utilizou no Delphi. Para mais detalhes, consulte (no Visual Studio.NET): ms-help://MS.VSCC/MS.MSDNVS/vblr7/html/vastmDeclare.htm

Alternativamente você também pode utilizar o atributo DLLImport (no caminho acima você também o encontrará).

Bom, qualquer coisa, 'stamos aí.

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0
Guest - Ramalho -

Graymalkin,

Usei o Declare conforme você informou, tomei o cuidado de manter os mesmos tipo(s) para os parâmetro e para a função, o programa executa normalmente mas quando chega na execução da DLL ocorre o seguinte erro: "Unable to find an entry point named minhadll in DLL", Você sabe o que pode estar acontecendo?

Já olhei na documentação indicada e internet, mas não consegui ter esclarecimantos.

Desde já agradeço.

Link para o comentário
Compartilhar em outros sites

  • 0
Graymalkin,

Usei o Declare conforme você informou, tomei o cuidado de manter os mesmos tipo(s) para os parâmetro e para a função, o programa executa normalmente mas quando chega na execução da DLL ocorre o seguinte erro: "Unable to find an entry point named minhadll in DLL", Você sabe o que pode estar acontecendo?

Já olhei na documentação indicada e internet, mas não consegui ter esclarecimantos.

Se ele não está encontrando o entry point (ponto de entrada) é porque a declaração não corresponde ao original (a busca é feita pela assintura da função, portanto algum dos tipos dos parâmetros ou o tipo de retorno não estão adequados). Você poderia postar a declaração da função aqui? Só a assinatura dela (o protótipo) em Delphi? E também como você está fazendo em VB.NET.

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

  • 0
Guest - Ramalho -

Graymalkin,

Segue a declaração da função em Delphi:

Function VariavelValor (strservidor:String;strcomposto:String;strvariavel:String):String;

Segue a declaração da função em VB.NET:

Declare Function VariavelValor Lib "ConexaoDDE.dll" Alias "VariavelValor" (ByVal strservidor As String, ByVal strcomposto As String, ByVal strvariavel As String) As String

Declaração feita logo abaixo de Public Class <Nome>

Desde já agradeço.

Link para o comentário
Compartilhar em outros sites

  • 0
Graymalkin,

Segue a declaração da função em Delphi:

Function VariavelValor (strservidor:String;strcomposto:String;strvariavel:String):String;

Segue a declaração da função em VB.NET:

Declare Function VariavelValor Lib "ConexaoDDE.dll" Alias "VariavelValor" (ByVal strservidor As String, ByVal strcomposto As String, ByVal strvariavel As String) As String

Declaração feita logo abaixo de Public Class <Nome>

Desde já agradeço.

De fato, deu problema aqui também. A solução aparente que encontrei foi trocar string por PChar. Minha DLL em Delphi (Project2.dll) ficou assim:

library Project2;

uses
  SysUtils,
  Classes;

{$R *.res}

function VariavelValor(strservidor, strcomposto, strvariavel : PChar) : PChar; stdcall;
begin
  VariavelValor := 'retorno';
end;

exports
  VariavelValor;

begin
end.
Daí, compilei e copiei para a pasta Windows\System32 (ou para a pasta do programa que vai utilizá-la). Depois, no VB.NET, declarei ela da seguinte maneira (dentro da classe do form principal):
Private Declare Function VariavelValor Lib "Project2.dll" (ByVal strservidor As String, ByVal strcomposto As String, ByVal strvariavel As String) As String
E utilizei ela:
Dim k As String = VariavelValor("", "", "")
MsgBox(k)

Não testei se os parâmetros passados pelo VB.NET chegam corretamente lá no Delphi, mas acredito que sim (pelo menos o contrário deu certo, já que pode-se ver o "retorno").

Faça esse teste aí e veja se dá tudo certo.

Abraços,

Graymalkin

Link para o comentário
Compartilhar em outros sites

Visitante
Este tópico está impedido de receber novos posts.


  • Estatísticas dos Fóruns

    • Tópicos
      152,2k
    • Posts
      651,9k
×
×
  • Criar Novo...