Pergunta

Estou interessado em chamar SoX , um aplicativo de console de código aberto, a partir de outro programa do Windows GUI ( escrito em Delphi naturalmente). Em vez de lidar com raspagem e ocultando a janela do console, eu gostaria de apenas converter o aplicativo para uma DLL que eu possa chamar de meu aplicativo.

Antes de começar por este caminho Estou curioso quanto trabalho eu deveria esperar para estar em? Estamos falando de uma grande empresa, ou há uma solução para a frente? Eu sei que alguns C, mas sou de nenhuma maneira um perito.

Eu não estou esperando SOX detalhes específicos, apenas EXE conversão aplicativo de console para DLL em geral. Se alguém está familiarizado com SoX, porém, ainda melhor.

Foi útil?

Solução

Para o tópico específico de transformar um executável console em uma biblioteca, modificando o código fonte C, isso depende de como o aplicativo de linha de comando está consignado. Se ele é escrito de tal maneira que I / O é canalizada através de um pequeno conjunto de funções ou ainda melhores ponteiros de função, então, obviamente, vai ser trivial.

Se tudo é feito com printf, scanf e amigos, então você provavelmente vai ser melhor fora de encontrar / criar um arquivo de inclusão que todos os arquivos de origem incluem e adicionando uma macro que redirecionamentos printf / scanf e amigos para suas próprias funções que são escritos de forma a ser passíveis de execução DLL. Coisas como printf pode ser construído a partir vsnprintf (usar o n-versão para a segurança), assim você não precisa reimplementar todo o C RTL I / O subsistema. No entanto, não há vsscanf, mas existem implementações de terceiros na web.

Se o código está usando fprintf, fscanf, etc. para permitir indireto entre arquivos e o console, você ainda está fora de sorte. A estrutura do arquivo é opaco, e ao contrário de arquivos de texto de Pascal, um motorista de arquivo de texto portátil não pode ser implementado. Pode ainda ser possível se você spelunk na sua específica C RTL, mas você seria melhor aconselhados a descer a rota macro e reimplementar o seu próprio tipo de arquivo renomeado.

Finalmente, a abordagem "popen ()" é possível em Delphi e fez um pouco mais fácil em Delphi 2009 com as classes TTextReader e TTextWriter. Combine-os com TFileStream envolto em torno das tubulações, e especificar tubos para entrada padrão, saída padrão e erro padrão no novo processo e STARTF_USESTDHANDLES, etc., e ele vai trabalhar. Se você não sentir vontade de escrever seu próprio país, existem equivalentes / amostras de terceiros na web para Delphi também. de Aqui um.

Outras dicas

No Windows, basta chamar CreateProcess com o comando SoX linha. Eu não sei as ligações Delphi para Win32, mas eu fiz essa coisa exata em Win32 e C #.

E agora que você sabe CreateProcess é o que você quiser chamar, uma pesquisa no Google sobre como fazer isso da Delphi deve dar-lhe todo o código que você precisa.

Delphi Canto Artigo - Usando CreateProcess para executar programas

chamada CreateProcess () o caminho mais fácil

Você pode até não precisa de uma DLL, você pode usar o popen () função para executar um aplicativo de console e recolher qualquer texto de saída.

Disclaimer: Eu não sei nada sobre SoX. Pode ser que o código é estruturado de forma a tornar esta tarefa fácil, ou pode ser mais difícil. De qualquer maneira, o processo é o mesmo:

Primeiro você quiser encontrar as funções na aplicação SoX que você deseja chamar. Muito provavelmente o aplicativo console tem código para analisar a linha de comando e chamar as funções apropriadas. Então, em primeiro lugar, encontrar as funções que você deseja usar.

A seguir, confira as informações sobre a exportação de funções em DLLs de C neste site: Criando E usando DLLs

Em seguida, fazer um novo makefile ou arquivo de projeto visual studio com a meta de ser uma DLL, e adicionar os sourcefiles do programa SoX que você tenha modificado a ser exportado.

Execute o processo, a maneira Indiv aconselhado e capturar a saída como a forma como Adam tem mostrado.

No entanto, se você ainda quer fazer a conversão DLL, isso irá ajudar a começar

  1. Configurar SOX para janelas e compilá-lo
  2. Crie um projeto DLL vazio usando o C ++ ferramenta
  3. Adicione os SOX arquivos a serem parte do projeto
  4. Adicionar uma nova função chamada DLLMain

    BOOL APIENTRY DllMain (PUNHO hModule, DWORD ul_reason_for_call, LPVOID) {return TRUE;}

  5. Adicionar um arquivo .def (use o nome do projeto como o nome do arquivo) que lista as exportações no DLL - Adicione o seguinte conteúdo a ele

    LIBRARY      "name.DLL" 
    

    EXPORTAÇÕES

    CallOldMain PRIVATE

  6. Mudar o nome do principal da SOX como CallOldMain

  7. Escrever uma função personalizada para registrar o erro de saída / retorno etc.

  8. Encontrar todos printfs / cout na aplicação SOX e substituí-lo com chamadas para sua função personalizada acima

  9. Uma vez que a DLL é compilado agora você pode chamar o CallOldMain função com os mesmos parâmetros principais programas de espera C. Você pode modificar essa assinatura para retornar a erros / saída de cima.

Você não mencionam o que o seu conjunto de ferramentas é, mas se você configure gcc no Windows, você pode usar a configuração normal; make; make install para apenas compilar Sox. No processo, ele irá criar um arquivo DLL e o aplicativo console. Ou, você pode apenas especificar o alvo make para fazer apenas o dll. Isto irá compilar um windows biblioteca nativa que só depende da dll runtime MS C, e você pode usar isso em seu próprio aplicativo.

Você pode executar um aplicativo de console e capturar sua saída usando tubos. Você usar o lado une do tubo de saída padrão para o CreateProcess e você lê a partir do outro lado como um arquivo comum.

Você pode ver um exemplo de trabalho escrito em delphi aqui: http: // delphi.about.com/cs/adptips2001/a/bltip0201_2.htm

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top