windef.h führt zu mehrdeutigem Symbol IServiceProvider



  • Hallo

    Ich bin ein dabei eine kleine Anwendung zum ansteuern von ein paar Schrittmotoren von Standa (http://www.standa.lt/products/catalog/motorised_positioners?item=175&prod=microstep_driver_usb_interface) zu schreiben. Zum Einsatz kommt Visual Studio 2005 Pro, die Anwendung ist ein 08/15 Windows Forms aus dem Designer.
    Der Hersteller des Schrittmotorcontrollers liefert vorkompilierte Binaries und die headerdatei USMCdll.h mit.
    Das Projekt heißt Justierprogramm mit einem Form1.h. In selbiges binde ich ein motoren.h ein zu dem es wiederum ein motoren.cpp gibt.
    Die Struktur an sich ohne USMCdll.h kompiliert schonmal.
    USMCdll.h enthält allerdings ein #include <windows.h> womit das eigentliche Drama beginnt.
    Compiliert wird übrigens mit /clr
    Zunächst gibt es etliche Fehler wie (gekürzt):

    c:\programme\microsoft visual studio 8\vc\platformsdk\include\servprov.h(93) : error C2872: 'IServiceProvider': Mehrdeutiges Symbol
    kann 'c:\programme\microsoft visual studio 8\vc\platformsdk\include\servprov.h(48) sein: System::IServiceProvider IServiceProvider'
    oder "c:\windows\microsoft.net\framework\v2.0.50727\mscorlib.dll : System::IServiceProvider"
    c:\programme\microsoft visual studio 8\vc\platformsdk\include\servprov.h(93) : error C3699: "": Diese Referenzierung kann nicht für den Typ "IServiceProvider" verwendet werden.
    Der Compiler ersetzt "
    " durch ^", um die Analyse fortzusetzen.
    c:\programme\microsoft visual studio 8\vc\platformsdk\include\servprov.h(100) : error C2371: 'IServiceProvider': Neudefinition; unterschiedliche Basistypen
    c:\programme\microsoft visual studio 8\vc\platformsdk\include\servprov.h(48): Siehe Deklaration von 'IServiceProvider'
    c:\programme\microsoft visual studio 8\vc\platformsdk\include\servprov.h(117) : error C2872: 'IServiceProvider': Mehrdeutiges Symbol
    kann 'c:\programme\microsoft visual studio 8\vc\platformsdk\include\servprov.h(100) sein: IServiceProvider'
    oder "c:\windows\microsoft.net\framework\v2.0.50727\mscorlib.dll : System::IServiceProvider"

    Den thread http://www.c-plusplus.net/forum/viewtopic-var-t-is-202406.html habe ich gelesen, konnte aber leider keine Lösung für mich daraus extrahieren.

    mit einem #define WIN32_LEAN_AND_MEAN vor dem #include "USMCDLL.h" bekomme ich diese Fehler zwar weg, erzeuge damit aber

    motoren.obj : error LNK2028: Nicht aufgelöstes Token (0A00000E) ""extern "C" unsigned long __cdecl USMC_Init(struct USMC_Devices_st &)" (?USMC_Init@@$$J0YAKAAUUSMC_Devices_st@@@Z)", auf das in Funktion ""public: __clrcall Justierprogramm::motor::motor(void)" (??0motor@Justierprogramm@@$$FQAAM@XZ)" verwiesen wird. motoren.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""extern "C" unsigned long \_\_cdecl USMC\_Init(struct USMC\_Devices\_st &)" (?USMC\_Init@@J0YAKAAUUSMC_Devices_st@@@Z)"inFunktion""public:__clrcallJustierprogramm::motor::motor(void)"(??0motor@Justierprogramm@@J0YAKAAUUSMC\_Devices\_st@@@Z)" in Funktion ""public: \_\_clrcall Justierprogramm::motor::motor(void)" (??0motor@Justierprogramm@@FQFQAAM@XZ)".

    An der Stelle bin ich dann erstmal mit meinem Latein am Ende.
    Es wäre schön, wenn mir mal einer erklären könnte was diese Fehlermeldung genau bedeutet und wie ich mit der Analyse des Problems weitermache.

    Ich könnte notfalls den gesamten Code (der momentan nur aus Deklarationen und leeren Methodenrümpfen besteht) oder die relevanten Teile nachliefern.

    Gruß
    predator





  • Hallo,

    und danke erstmal.
    Das Problem mit dem IServiceProvider durch das Einbinden von <windef.h> läßt sich ja über das #define WIN32_LEAN_AND_MEAN beheben.
    Da das Problem mit windef.h angefangen hat und ich noch nicht ganz mit Haare raufen fertig war, war ich gedanklich noch nicht ganz da.

    WIN32_LEAN_AND_MEAN wird auch in dem C++-Beispielprogram von Standa definiert und dürfte wohl legitim sein.
    Das eigentliche Problem ist nun vielmehr das "nicht aufgelöste Token"

    Ich habe das Problem noch einmal mit dem Beispielprogramm nachgestellt. Ich kann es nicht komplilieren und habe es auf das absolute Minimum zusammengekürzt um den Fehler nachzustellen.

    // motortest.cpp: Hauptprojektdatei.
    
    #include "stdafx.h"
    
    using namespace System;
    
    #pragma warning(disable : 4996) // Disable warnings about some functions in VS 2005
    #define WIN32_LEAN_AND_MEAN		// Exclude rarely-used stuff from Windows headers
    #include <stdio.h>
    #include <tchar.h>
    #include <conio.h>
    #include <process.h>
    #include "USMCDLL.h"
    
    USMC_Devices DVS;
    DWORD Dev;
    
    int Exit(void)
    {
    	printf("\nPress any key to exit");
    	_getch();
    	return 0;
    }
    
    int _tmain(int argc, _TCHAR* argv[])
    {
    	system("cls");
    	if( USMC_Init( DVS ) )
    	{
    	//	PrintError();
    		return Exit();
    	}
    
    	//while(SelectMenu());
    
    	return Exit();
    }
    

    Ausschnitte aus der headerdatei

    //	USMCDLL.h	- header file with declorations of USMCDLL.dll functions and used structures
    //	-SD
    //  Note::C++
    //  Use functions with reference arguments as in sample
    //  Note.C
    //	Use functions with address of operator in invoke expression: func(var1, &struct);
    //	(For Rev. 24) Will work correctly with firmware version 24.03 or better
    
    #pragma once
    
    #include <windows.h>
    
    // Please use the USMCDLL.lib to easely import functions from dll with "dllimport" (In Microsoft Visual Studio)
    #ifdef USMCDLL_EXPORTS
    #define USMCDLL_API __declspec(dllexport)
    #else
    #define USMCDLL_API __declspec(dllimport)
    #endif
    
    // Structure representing connected devices
    typedef struct USMC_Devices_st{
    	DWORD NOD;			// Number of the devices ready to work
    
    	char **Serial;		// Array of 16 byte ASCII strings
    	char **Version;		// Array of 4 byte ASCII strings
    } USMC_Devices;			// Structure representing connected devices
    ... diverse structs für Position/Temperatur/Geschwindigkeit/Rampen....
    
    #ifdef __cplusplus	// C++
    extern "C" {
    // 
    //	 The USMC_Init function initializes driver and returns devices information
    //
    USMCDLL_API DWORD USMC_Init( USMC_Devices &Str);		// OUT - Array of structures describing all divices (may be NULL) MUST NOT be deleted
    
    ... diverse externe Funktionen ...
    #else	// C
    DWORD USMC_Init( USMC_Devices *Str );
    ... diverse externe Funktionen ...
    #endif	// C/C++
    

    Und das Ergebnis ist wieder:
    ------ Erstellen gestartet: Projekt: motortest, Konfiguration: Debug Win32 ------
    Kompilieren...
    motortest.cpp
    Verknüpfen...
    motortest.obj : error LNK2028: Nicht aufgelöstes Token (0A00000F) ""extern "C" unsigned long __cdecl USMC_Init(struct USMC_Devices_st &)" (?USMC_Init@@$$J0YAKAAUUSMC_Devices_st@@@Z)", auf das in Funktion ""int __cdecl wmain(int,wchar_t * * const)" (?wmain@@$$HYAHHQAPA_W@Z)" verwiesen wird.
    motortest.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol ""extern "C" unsigned long __cdecl USMC_Init(struct USMC_Devices_st &)" (?USMC_Init@@$$J0YAKAAUUSMC_Devices_st@@@Z)" in Funktion ""int __cdecl wmain(int,wchar_t * * const)" (?wmain@@$$HYAHHQAPA_W@Z)".
    C:\Dokumente und Einstellungen\heinrici\Eigene Dateien\Visual Studio 2005\Projects\motortest\Debug\motortest.exe : fatal error LNK1120: 2 nicht aufgelöste externe Verweise.
    Das Buildprotokoll wurde unter "file://c:\Dokumente und Einstellungen\heinrici\Eigene Dateien\Visual Studio 2005\Projects\motortest\motortest\Debug\BuildLog.htm" gespeichert.
    motortest - 3 Fehler, 0 Warnung(en)
    ========== Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungen ==========

    Ich hoffe mal meine Gedanken waren jetzt weit genug geordnet, als dass die Außenwelt mich versteht.
    🙂



  • USMCDLL.lib dazugelinkt?



  • Nur ist gleiche Verzeichnis kopiert wie die usmcdll.h.

    Wo sag ich dem linker denn, dass ich die usmcdll.lib dazulinken möchte.



  • Projekt Settings -> Linker -> Input



  • #pragma comment(lin, "USMCDLL.lib")
    


  • Hallo,

    danke erstmal.
    Habe mich wohl etwas doof angestellt. Aber in der letzten Firma habe ich bei sowas immer einen anderen gefragt, was ich machen muss um die headers und libs für diese und jene Hardware einzubinden. Der hat sich dann 10 Minuten hingesetzt und ich musste mich nur noch ums reine C++ kümmern.

    Gruß
    predator


Anmelden zum Antworten