Domanda

Questo penso sia legato al mio uso dell'API C ++ nlog (e la mia domanda sul forum nlog è qui ); lo scopo di porre questa domanda qui è di attirare un pubblico più ampio sul mio problema e forse anche di avere alcune idee più generali dietro l'incapacità dell'IDE VB6 di costruire nel mio particolare scenario.

In breve, il problema che sto riscontrando è che ho problemi a costruire componenti VB6 che fanno riferimento a componenti C ++ non gestiti che hanno chiamate all'API C \ C ++ di nlog (che è definita in NLogC.DLL). I problemi di compilazione non si verificano durante il tempo di compilazione, si verificano durante la compilazione del file binario, il che mi suggerisce che si tratta di un tipo di problema di tipo linker? Non so abbastanza su come vengono prodotti i binari VB6 per dirlo. Viene prodotto il binario VB6, ma è danneggiato e si arresta in modo anomalo poco dopo essere stato invocato.

Qualcuno ha avuto esperienze simili con VB6 (non deve essere correlato a nlog o C ++)?

modifica: grazie per tutte le risposte a questo problema piuttosto oscuro. Purtroppo non c'è ancora alcun progresso; i miei risultati da quando ho pubblicato questo:

  1. 'Ritoccare' le opzioni di compilazione non sembrano aiutare in questo problema.
  2. L'aggiunta di un riferimento al componente C ++ abilitato per nlog da un progetto VB6 'vuoto' non lo arresta in modo anomalo o causa strani problemi di compilazione. Quindi non è un problema VB6 "nativo", forse un problema con l'interazione tra nlog e i vari componenti e le librerie di terze parti utilizzate da altri componenti di riferimento?
  3. Per quanto riguarda le convenzioni di chiamata C ++: il componente C ++ abilitato per nlog è - per quanto posso vedere - conforme a queste convenzioni e funziona davvero bene quando viene indicato da VB6 purché non stia effettuando chiamate API nlog. Non sono sicuro che lo stesso nlogc.DLL sia conforme a VB6, ma avrei pensato che fosse irrilevante poiché le chiamate API venivano effettuate dal componente C ++; VB6 non dovrebbe sapere o preoccuparsi di ciò a cui fa riferimento il componente C ++ (per quanto riguarda la mia comprensione in merito ...)

edit2: dovrei anche notare che il messaggio di errore ottenuto durante la generazione è: " Errori durante il caricamento. Fai riferimento a " xxx " per dettagli " ;. Quando apro il file di registro, tutto ciò che c'è dentro è: " Impossibile caricare il controllo xxx " ;. È interessante notare che tutti i riferimenti a quel particolare controllo scompaiono da quel particolare progetto risultando in errori di compilazione se dovessi provare a ricostruire.

È stato utile?

Soluzione

Ho risolto il problema utilizzando l'interfaccia COM di NLog (NLog.ComInterop.DLL) dal mio codice C ++ non gestito. Non è facile da fare come l'API C \ C ++ ma almeno non va in crash i miei componenti VB6.

Altri suggerimenti

Proverei a modificare alcune delle opzioni Compila che si trovano nel Progetto , nel menu Proprietà , nel pannello Compila per vedere se danno ulteriori suggerimenti su cosa non va.

Ad esempio, se si compila l'eseguibile in codice p anziché codice nativo , si blocca comunque all'avvio.

Quale messaggio di errore viene visualizzato quando si esegue il file binario compilato?

Dubito che il compilatore / linker sia il problema: i riferimenti al progetto in un progetto VB6 non sono collegati all'eseguibile finale. Un riferimento di progetto in VB6 è in realtà un riferimento a una libreria di tipi COM (che può o meno essere incorporata in una DLL o in un altro tipo di file binario). I riferimenti al progetto hanno principalmente due scopi:

  1. L'IDE estrae le informazioni sul tipo dalle librerie dei tipi a cui viene fatto riferimento che vengono quindi visualizzate nel browser degli oggetti (e nel menu a discesa Intellisense)

  2. Al momento della compilazione, il compilatore estrae le informazioni sul tipo memorizzate nelle librerie di riferimento, incluso il CLSID di ogni classe che viene creata un'istanza e incorpora questi dati nell'eseguibile. Ciò consente all'eseguibile di creare istanze di classi contenute nelle librerie a cui si fa riferimento.

Nota che il binario compilato non si collega a nessun codice nelle librerie referenziate e non contiene nemmeno i nomi dei file delle librerie referenziate. L'eseguibile finale contiene solo le informazioni sul CLSID e di altro tipo necessarie per creare un'istanza degli oggetti COM in fase di esecuzione.

È molto più probabile che il problema sia con NLog, o con come lo chiami dal tuo codice, piuttosto che qualcosa che non va nel processo di compilazione di VB6.

Se pensi che potrebbe essere un problema con il linker, questo dovrebbe bloccarsi allo stesso modo:

  1. crea un nuovo progetto standard (di qualsiasi tipo)
  2. aggiungi un nuovo modulo e copia le dichiarazioni " dichiarare " in esso
  3. di compilazione

Se non si blocca è qualcos'altro.

Aiuterebbe una descrizione esatta dell'errore o uno screenshot di ciò che sta accadendo.

Una cosa da controllare è ovunque NLogC.DLL o la DLL C ++ che hai creato abbiano la convenzione di chiamata corretta definita. Fondamentalmente non è possibile modificare i nomi delle funzioni DLL o utilizzare altro che la convenzione di chiamata STDCALL. Se la DLL C ++ non è stata creata pensando a queste due cose, non funzionerà con VB6.

Articolo MSDN sulla convenzione di chiamata.

" Impossibile caricare il controllo xxx " gli errori possono essere causati da file .oca creati da una versione diversa di un .ocx di quella attualmente utilizzata. In tal caso, l'eliminazione dei file .oca aiuta.

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