SchindlerD
Grünschnabel
Hallo liebe Forenmitglieder!
Vielleicht könnt ihr mir bei einem (für mich) kniffligen Problemchen helfen. Vermutlich mache ich etwas grundlegendes falsch. Ich verwende Visual Studio 2005 und schreibe an einer Windows Forms Anwendung, die später mal Daten loggen soll.
Hm, wie fange ich jetzt am besten an?
Zu meinem AD-Wandler hat der Hersteller (bmcm) eine nette Bibliothek mitgeliefert, die ich natürlich jetzt gerne in meiner Windows Forms Anwendung verwenden würde.
Ich habe mal eine Testapplikation für die Konsole geschrieben, da hat alles wunderbar geklappt.
Schnipsel:
Prototyp in der mitgelieferten Headerdatei:
Die .lib datei und die mitgelieferten header habe ich zu den Programm-headern und .cpp dateien gespeichert und die .dll zur .exe. Außerdem habe ich die .lib über project/properties/linker/input als additional dependency angegeben (sorry, habe nur die englische Version von VS...).
So weit, so gut. Als nächstes habe ich versucht, das Selbe in einem Windows Forms Projekt hinzubekommen.
Schnipsel:
Leider kriege ich jetzt beim Kompilieren folgende Fehlermeldungen:
Error 1 error LNK2031: unable to generate p/invoke for "extern "C" int __clrcall ad_open(char const *)" (?ad_open@@$$J0YMHPBD@Z); calling convention missing in metadata adiotest.obj
Error 2 error LNK2028: unresolved token (0A000010) "extern "C" int __clrcall ad_open(char const *)" (?ad_open@@$$J0YMHPBD@Z) referenced in function "private: void __clrcall adiotest::Form1::timer1_Tick(class System::Object ^,class System::EventArgs ^)" (?timer1_Tick@Form1@adiotest@@$$FA$AAMXP$AAVObject@System@@P$AAVEventArgs@4@@Z) adiotest.obj
Error 3 error LNK2019: unresolved external symbol "extern "C" int __clrcall ad_open(char const *)" (?ad_open@@$$J0YMHPBD@Z) referenced in function "private: void __clrcall adiotest::Form1::timer1_Tick(class System::Object ^,class System::EventArgs ^)" (?timer1_Tick@Form1@adiotest@@$$FA$AAMXP$AAVObject@System@@P$AAVEventArgs@4@@Z) adiotest.obj
Error 4 fatal error LNK1120: 2 unresolved externals
adiotest.exe
Die Kommentare zu den Fehlern unter MSDN helfen mir irgendwie nicht weiter...
Ich habe mir jetzt mal zusammengereimt, dass der Kompiler versucht, die Funktionen über __clrcall aufzurufen - und daran scheitert? Kann man diesen Versuch irgendwie unterdrücken? Für andere Lösungen bin ich natürlich jederzeit offen
Natürlich habe ich die .lib wieder zu den headern gepackt. Eine .exe wird aber erst garnicht erstellt, also erübrigt es sich, die .dll irgendwo hin zu speichern.
Zusätzlich zu dieser Bibliothek gibt es noch eine ActiveX Control (inclusive Library) für den Wandler. Könnt ihr mir erklären wozu ich das brauche? Soll ich mal versuchen damit zu arbeiten? Ich dachte ActiveX hätte nur etwas mit der Darstellung zu tun und dafür hätte ich ja die Windows Form?
Vielen Dank schonmal für eure Hilfe!
Liebe Grüße,
SchindlerD
Vielleicht könnt ihr mir bei einem (für mich) kniffligen Problemchen helfen. Vermutlich mache ich etwas grundlegendes falsch. Ich verwende Visual Studio 2005 und schreibe an einer Windows Forms Anwendung, die später mal Daten loggen soll.
Hm, wie fange ich jetzt am besten an?
Zu meinem AD-Wandler hat der Hersteller (bmcm) eine nette Bibliothek mitgeliefert, die ich natürlich jetzt gerne in meiner Windows Forms Anwendung verwenden würde.
Ich habe mal eine Testapplikation für die Konsole geschrieben, da hat alles wunderbar geklappt.
Schnipsel:
C++:
#include "stdafx.h"
#include "libad.h" // Header der lib
int _tmain(int argc, _TCHAR* argv[])
{
int32_t adh;
//...
adh = ad_open ("pc20"); // hier wird ein Befehl aus der lib verwendet
//...
}
C++:
int32_t
ad_open (const char *name);
So weit, so gut. Als nächstes habe ich versucht, das Selbe in einem Windows Forms Projekt hinzubekommen.
Schnipsel:
C++:
#include <cstdlib>
#include "libad.h"
#pragma comment(lib, "libad4.lib")
//...
private: System::Void timer1_Tick(System::Object^ sender, System::EventArgs^ e) {
int32_t adh;
adh = ad_open("pc20"); // selber Befehl wie im Konsolen-Programm
//...
}
Error 1 error LNK2031: unable to generate p/invoke for "extern "C" int __clrcall ad_open(char const *)" (?ad_open@@$$J0YMHPBD@Z); calling convention missing in metadata adiotest.obj
Error 2 error LNK2028: unresolved token (0A000010) "extern "C" int __clrcall ad_open(char const *)" (?ad_open@@$$J0YMHPBD@Z) referenced in function "private: void __clrcall adiotest::Form1::timer1_Tick(class System::Object ^,class System::EventArgs ^)" (?timer1_Tick@Form1@adiotest@@$$FA$AAMXP$AAVObject@System@@P$AAVEventArgs@4@@Z) adiotest.obj
Error 3 error LNK2019: unresolved external symbol "extern "C" int __clrcall ad_open(char const *)" (?ad_open@@$$J0YMHPBD@Z) referenced in function "private: void __clrcall adiotest::Form1::timer1_Tick(class System::Object ^,class System::EventArgs ^)" (?timer1_Tick@Form1@adiotest@@$$FA$AAMXP$AAVObject@System@@P$AAVEventArgs@4@@Z) adiotest.obj
Error 4 fatal error LNK1120: 2 unresolved externals
adiotest.exe
Die Kommentare zu den Fehlern unter MSDN helfen mir irgendwie nicht weiter...
Ich habe mir jetzt mal zusammengereimt, dass der Kompiler versucht, die Funktionen über __clrcall aufzurufen - und daran scheitert? Kann man diesen Versuch irgendwie unterdrücken? Für andere Lösungen bin ich natürlich jederzeit offen

Natürlich habe ich die .lib wieder zu den headern gepackt. Eine .exe wird aber erst garnicht erstellt, also erübrigt es sich, die .dll irgendwo hin zu speichern.
Zusätzlich zu dieser Bibliothek gibt es noch eine ActiveX Control (inclusive Library) für den Wandler. Könnt ihr mir erklären wozu ich das brauche? Soll ich mal versuchen damit zu arbeiten? Ich dachte ActiveX hätte nur etwas mit der Darstellung zu tun und dafür hätte ich ja die Windows Form?
Vielen Dank schonmal für eure Hilfe!
Liebe Grüße,
SchindlerD
Zuletzt bearbeitet von einem Moderator: