Domanda

Sono interessato a chiamare SoX , un'applicazione console open source, da un altro programma GUI di Windows ( scritto in Delphi naturalmente). Invece di occuparmi di raschiare e nascondere la finestra della console, vorrei solo convertire l'applicazione in una DLL che posso chiamare dalla mia applicazione.

Prima di iniziare questo percorso, sono curioso di sapere quanto lavoro dovrei aspettarmi di fare? Stiamo parlando di un'impresa importante o esiste una soluzione diretta? Conosco un po 'di C, ma non sono affatto un esperto.

Non mi aspetto dettagli specifici di SoX, ma solo la conversione dell'applicazione DLL della console in DLL in generale. Se qualcuno ha familiarità con SoX, anche meglio.

È stato utile?

Soluzione

Per l'argomento specifico di trasformare un eseguibile della console in una libreria modificando il codice sorgente C, dipende da come viene fatturata l'applicazione da riga di comando. Se è scritto in modo tale che l'I / O viene incanalato attraverso un piccolo set di funzioni o anche migliori puntatori di funzioni, ovviamente sarà banale.

Se tutto è fatto con printf, scanf e amici, probabilmente ti conviene trovare / creare un file include che includa tutti i file sorgente e aggiungere una macro che reindirizzi printf / scanf e gli amici alle tue funzioni scritti in modo da poter essere implementati con DLL. Cose come printf possono essere costruite da vsnprintf (usare la versione n per sicurezza), quindi non è necessario reimplementare l'intero sottosistema I / O C RTL. Tuttavia, non esiste vsscanf, ma ci sono implementazioni di terze parti sul web.

Se il codice utilizza fprintf, fscanf, ecc. per abilitare l'indirizzamento indiretto tra i file e la console, sei ancora sfortunato. La struttura FILE è opaca e, diversamente dai file di testo Pascal, non è possibile implementare un driver di file di testo portatile. Potrebbe essere ancora possibile se hai inserito il tuo C RTL specifico, ma ti consigliamo di seguire la macro route e reimplementare il tuo tipo FILE rinominato.

Infine, il " popen () " l'approccio è possibile in Delphi e reso leggermente più semplice in Delphi 2009 con le classi TTextReader e TTextWriter. Combina questi con i tubi avvolti TFileStream e specifica i tubi per input standard, output standard ed errore standard nel nuovo processo e STARTF_USESTDHANDLES, ecc., E funzionerà. Se non hai voglia di scrivere il tuo, ci sono equivalenti / campioni di terze parti sul web anche per Delphi. Eccone uno.

Altri suggerimenti

In Windows, basta chiamare CreateProcess con il comando SoX linea. Non conosco i collegamenti Delphi per Win32, ma ho fatto esattamente questa cosa sia in Win32 che in C #.

E ora che sai che CreateProcess è ciò che vuoi chiamare, una ricerca su Google su come farlo da Delphi dovrebbe darti tutto il codice di cui hai bisogno.

Articolo angolo di Delphi - Utilizzo di CreateProcess per eseguire i programmi

Chiamare CreateProcess () nel modo più semplice

Potrebbe non essere nemmeno necessaria una DLL, è possibile utilizzare la funzione popen () per eseguire un'applicazione console e raccogliere qualsiasi testo di output.

Dichiarazione di non responsabilità: non so nulla di SoX. È possibile che il codice sia strutturato in modo da renderlo semplice o potrebbe essere più difficile. In entrambi i casi, il processo è lo stesso:

Per prima cosa vuoi trovare le funzioni nell'applicazione SoX che vuoi chiamare. Molto probabilmente l'app console ha un codice per analizzare la riga di comando e chiamare le funzioni appropriate. Quindi, prima di tutto, trova le funzioni che desideri utilizzare.

Successivamente, controlla le informazioni sull'esportazione delle funzioni nelle DLL da C in questo sito: Creazione e Utilizzo di DLL

Quindi crea un nuovo makefile o un file di progetto di Visual Studio con la destinazione come una DLL e aggiungi i file sorgente dal programma SoX che hai modificato per essere esportato.

Esegui il processo, come consigliato da Indiv e cattura l'output come mostrato da Adam.

Tuttavia, se vuoi ancora fare la conversione DLL, questo ti farà iniziare

  1. Configura SOX per Windows e compilarlo
  2. Crea un progetto DLL vuoto usando il tuo strumento C ++
  3. Aggiungi i file SOX per far parte del progetto
  4. Aggiungi una nuova funzione chiamata DLLMain

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

  5. Aggiungi un file .DEF (usa il nome del progetto come nome del file) che elenca le esportazioni nella DLL - Aggiungi il seguente contenuto ad esso

    LIBRARY      "name.DLL" 
    

    Esporta

    CallOldMain PRIVATE

  6. Rinomina il main di SOX come CallOldMain

  7. Scrivi una funzione CUSTOM per registrare l'errore di output / return ecc.

  8. Trova tutti printfs / cout nell'applicazione SOX e sostituiscili con chiamate alla tua funzione personalizzata sopra

  9. Una volta compilata la DLL, è ora possibile chiamare la funzione CallOldMain con gli stessi parametri previsti dai programmi principali di C. È possibile modificare questa firma per restituire gli errori / l'output dall'alto.

Non menzionate quale sia la vostra toolchain, ma se configurate gcc in Windows, potete usare la normale configurazione; make; make install per compilare sox. Nel processo, creerà un file dll e l'app console. In alternativa, è possibile specificare solo make target per creare solo la dll. Questo compila una libreria nativa di Windows che dipende solo dalla dll di runtime di MS C e puoi usarla nella tua app.

È possibile eseguire un'applicazione console e catturarne l'output tramite pipe. Usi un lato della pipe come stdout per CreateProcess e leggi dall'altra parte come un file comune.

Puoi vedere un esempio funzionante scritto in delphi qui: http: // delphi.about.com/cs/adptips2001/a/bltip0201_2.htm

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top