HomeBlogMagic

Lösen des Fehlers 'void __cdecl `eh vector constructor iterator'(void *,unsigned __int64,unsigned __int64,void (__cdecl*)(void *

Beim kompilieren von meinen Treiber Sourcen ist mir folgender Fehler untergekommen:

error LNK2019: unresolved external symbol "void __cdecl `eh vector constructor iterator'(void *,unsigned __int64,unsigned __int64,void (__cdecl*)(void *),void (__cdecl*)(void *))" (??_L@YAXPEAX_K1P6AX0@Z2@Z) referenced in function

Grund für den Fehler ist folgendes Beispiel:

class CTemp
{
public:
  CTemp()
  {
  }
  virtual ~CTemp()
  {
  }
  int i = 0;
};

/**
 * @brief Class impelmentation
 */
class CcFsDriver : public NKernelModule::IFsDriver
{
public:
  CTemp oFailingArray[20]; //!<<<<<<< Reason for error
};

Das ist ein Beispielhafter Auszug aus einem Beispieltreibers in meinem Framework.
Der Fehler tritt beim initialisieren des arrays oFailingArray auf.

Im Treiberframework lässt sich die Runtime nicht ohne weiteres linken, weshalb der Compiler vergeblich nach der Funktion sucht, welche ein Array in einer Schleife initialisiert.
Eine Funktion mit dem Namen __ehvec_ctor und zum löschen __ehvec_dtor.

Diese Funktionen gilt es jetzt selbst zu implementieren. Dazu habe ich ein wenig recherchiert und bin auf diese nützlichen Zeilen Code gestoßen:

Dort findet sich die Implementierung für die beiden Funktionen:

void __cdecl __ehvec_ctor(void* ptr, size_t size, size_t count, void(__cdecl *pCtor)(void*), void(__cdecl *pDtor)(void*))
void __cdecl __ehvec_dtor(void* ptr, size_t size, size_t count, void(__cdecl *pDtor)(void*));

Mit ein paar Abwandlungen habe ich diese jetzt auch in mein Framework integriert.

Permalink: https://adirmeier.de/Blog/ID_370
Tags: Blog, C/C++, Dirver, Windowsvon am 2021-04-20