' schrieb:PostLVUserEvent() ist eine C Manager Funktion in LabVIEW. LabVIEW.LIB ist so gemacht dass es alle manager Funktionen dynamisch linkt, d.h erst wenn sie zum ersten Mal aufgerufen werden. Dazu stellt es das aufrufende LabVIEW Module fest - LabVIEW.exe (oder lvrt.dll für eine Applikation) - und macht dann ein GetProcAddress für die entsprechende Funktion. Da der Fehler von LabVIEW.LIB kommt muss es von einer C Routine kommen, also eine DLL die irgendwo in Deinem Code eingebunden wird.
PostLVUserEvent() ist eine ziemlich advanced Funktion also entweder rufst Du eine NI DLL irgendwo auf oder Du hast Dir irgendwo eine entsprechende DLL hergeholt. Kann es sein dass Du versuchst eine DLL die eigentlich für LabVIEW gedacht ist in einem nicht LabVIEW Kontext auszuführen (beispieslweise einem Executable dass dann über Remoting, Out of Process ActiveX oder was auch immer) irgendwie in LabVIEW integriert wird)?
Oder Deine abstrakten Klassen machen das LabVIEW Environment so spezial dass LabVIEW.lib in Deiner DLL die LabVIEW Runtime nicht mehr lokalisieren kann.
Rolf Kalbermatter
Also die einzige DLL die ich dynamisch lade ist eine von einem Kamerahersteller. Also keine NI DLL. Mein Code ist eigentlich gar nichtmal so kompliziert. Ich mache mal ein vereinfachtes Bsp.:
Abstrakte Klasse:
<div class='codetop'>CODE</div><div class='codemain' style='height:200px;white-space:pre;overflow:auto'>class cam_interface
{
public:
Abstract_Cam_Interface();
virtual ~Abstract_Cam_Interface();
virtual int Connect()= 0;
}
</div>
Kamaeraklasse:
<div class='codetop'>CODE</div><div class='codemain' style='height:200px;white-space:pre;overflow:auto'>class Kamera : public virtual cam_interface
{
private:
Cam_DLL_Fcts FctAddr; // Struktur für die Einsprungadressen.
public:
// Auf Konstruktor und Destruktor habe ich fürs Forum verzichtet.
int Connect();
}</div>
Zugehörige CPP:
<div class='codetop'>CODE</div><div class='codemain' style='height:200px;white-space:pre;overflow:auto'>int Kamera::Connect()
{
HINSTLIB Lib = LoadLibrary("cam.dll")
if(Lib)
{
Kamera::FctAddr.GetSources = (irb_GetSources)GetProcAddress(Lib, "cam_GetSources");
Kamera::FctAddr.InitSource = (irb_InitSource)GetProcAddress(Lib, "cam_InitSource");
Kamera::FctAddr.CloseSource = (irb_CloseSource)GetProcAddress(Lib, "cam_CloseSource");
Kamera::FctAddr.Grab = (irb_Grab)GetProcAddress(Lib, "cam_Grab");
}
this->GetFctAddr().GetSources(&SrcID); // Adresse auf Variable welche mit der SourceID beschrieben wird.
this->InitSource(SrcID); // Verbindungsaufbau mit der Quelle.
this->Grab(void* buf); // buf wurde vorher mit new allociert.
TD1Hdl LVMem = NULL; // Struktur wurde vorher angelegt.
NumericArrayResize(uW, 1L, SizeX*SizeY); // SizeX SizeY entspricht der Kameraauflösung.
(*LVMem)->DimSize = SizeX*SizeY;
MoveBlock(buf, &LVMem.Elements, sizeof(unsigned short int) * SizeX * SizeY)
PostLVUserEvent(Ref, &LVMem); // Ref wurde vorher von LV Übergeben.
return this->CloseSource(SrcID);
}
}
</div>
DLL Main:
<div class='codetop'>CODE</div><div class='codemain' style='height:200px;white-space:pre;overflow:auto'>
extern "C" __declspec(dllexport) int Connect()
{
Kamera Cam; // Objekt der Klasse erzeugen.
Abstract_Cam_Interface *Interface = &Cam; // Interfacepointer anlegen.
return Interface->Connect(); // Funktion ausführen.
}
</div>