Come sostituire le chiamate alle funzioni WinAPI nel progetto MS VC++ con la mia implementazione (il nome e il set di parametri sono gli stessi)?

StackOverflow https://stackoverflow.com/questions/60641

  •  09-06-2019
  •  | 
  •  

Domanda

Devo sostituire tutte le chiamate WinAPI di

  • Crea file,
  • LeggiFile,
  • SetFilePointer,
  • ChiudiHandle

con la mia implementazione (che utilizza la lettura di file di basso livello tramite Bluetooth).Il codice in cui verranno sostituite le funzioni è Video File Player e funziona già con i normali file hdd.È inoltre necessario che il Video Player possa ancora riprodurre file dall'HDD, se il file nell'ingresso del VideoPlayer è un normale file HDD.

Qual è la pratica migliore per tale compito?

È stato utile?

Soluzione

Ti suggerisco di seguire questi passaggi:

  1. Scrivi un insieme di funzioni wrapper, ad esempio MyCreateFile, MyReadFile, ecc., che inizialmente chiamano semplicemente l'API corrispondente e passano gli stessi argomenti, senza modifiche.
  2. Utilizza il tuo editor di testo per cercare tutte le chiamate alle API originali e sostituiscile con chiamate alle nuove funzioni wrapper.
  3. Verificare che l'applicazione funzioni ancora correttamente.
  4. Modifica le funzioni wrapper per adattarle ai tuoi scopi.

Tieni presente che CreateFile è una macro che si espande in CreateFileW o CreateFileA, a seconda che sia definito UNICODE.Considera l'utilizzo di LPCTSTR e il file Funzioni TCHAR in modo che la tua applicazione possa essere creata come ANSI o Unicode.

Si prega di non utilizzare #define, come suggerito in altre risposte qui, poiché ciò porterà solo a problemi di manutenzione e, come sottolinea correttamente Maximilian, non è una procedura ottimale.

Altri suggerimenti

Potresti semplicemente scrivere le tue nuove funzioni in uno spazio dei nomi personalizzato.per esempio.

namespace Bluetooth
{
  void CreateFile(/*params*/);
  void etc...
}

Quindi nel tuo codice, l'unica cosa che dovresti cambiare è:

if (::CreateFile(...))
{
}

A

if (Bluetooth::CreateFile(...))
{
}

Facile!:)

Se stai cercando di intercettare le chiamate a queste API da un'altra applicazione, considera Deviazioni.

Se puoi modificare il codice, dovresti semplicemente riscriverlo per utilizzare un'API personalizzata che faccia ciò che desideri.In caso contrario, usa la tecnica di Maximilian, ma tieni presente che è un orrore di manutenzione.

Se non puoi modificare il codice, puoi applicare patch alle tabelle di importazione per reindirizzare le chiamate al tuo codice.Una descrizione di questa tecnica si trova in Questo articolo - cerca la sezione intitolata "Spionaggio alterando la tabella degli indirizzi di importazione".

Questo è pericoloso, ma se stai attento puoi farlo funzionare.Controlla anche Microsoft Deviazioni, che fa lo stesso genere di cose ma non richiede che tu ti occupi delle patch effettive.

Se vuoi davvero dirottare l'API, guarda siringa.dll (L-GPL).

Non penso che questa sia la pratica migliore, ma dovrebbe funzionare se la inserisci in un file di inclusione incluso ovunque si chiami la funzione che desideri modificare:

#define CreateFile MyCreateFile

HRESULT MyCreateFile(whatever the params are);

L'implementazione di MyCreateFile è simile alla seguente:

#undef CreateFile
HRESULT MyCreateFile(NobodyCanRememberParamListsLikeThat params)
{
    if (InputIsNormalFile())
        CreateFile(params);
    else
        // do your thing
}

Fondamentalmente rendi ogni chiamata CreateFile una chiamata MyCreateFile in cui puoi decidere se vuoi utilizzare la tua implementazione o quella originale.

Disclaimer:Penso che farlo sia brutto e non lo farei.Preferirei cercare e sostituire tutte le occorrenze o qualcosa del genere.

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