SAP Connector mit Netweaver RFC SDK
-
Hallo c++ community,
ich bin Neuling im Bereich C++ und komme eigentlich aus der SAP ABAP Ecke.
Ich habe eine neues Projekt angefangen und zwar anhand von Netweaver RFC SDK welches in C++ geschrieben ist einen SAP Connector zu bauen.
Um diese SDK zu nutzen muss man bestimmte lib-Dateien von SAP einbinden. Und schon dabei habe ich meine Probleme.Beim kompilieren mit Visual Studio 2010 für C++ bekomme ich folgende Fehler:
1>------ Erstellen gestartet: Projekt: sap_connect0r_v001, Konfiguration: Debug Win32 ------
1>kernel32.lib(KERNEL32.dll) : warning LNK4237: /SUBSYSTEM:NATIVE wurde beim Importieren von "KERNEL32.DLL" angegeben. Verwenden Sie /SUBSYSTEM:CONSOLE oder /SUBSYSTEM:WINDOWS.
1>MSVCRT.lib(MSVCR100.dll) : warning LNK4237: /SUBSYSTEM:NATIVE wurde beim Importieren von "MSVCR100.DLL" angegeben. Verwenden Sie /SUBSYSTEM:CONSOLE oder /SUBSYSTEM:WINDOWS.
1>sap_connect0r_v001.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_RfcCloseConnection@8" in Funktion ""void __cdecl errorHandling(enum _RFC_RC,char * const,struct _RFC_ERROR_INFO *,struct _RFC_CONNECTION_HANDLE *)" (?errorHandling@@YAXW4_RFC_RC@@QADPAU_RFC_ERROR_INFO@@PAU_RFC_CONNECTION_HANDLE@@@Z)".
1>sap_connect0r_v001.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_RfcDestroyFunction@8" in Funktion "_nlsui_main".
1>sap_connect0r_v001.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_RfcGetString@24" in Funktion "_nlsui_main".
1>sap_connect0r_v001.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_RfcGetStructure@16" in Funktion "_nlsui_main".
1>sap_connect0r_v001.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_RfcInvoke@12" in Funktion "_nlsui_main".
1>sap_connect0r_v001.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_RfcSetChars@20" in Funktion "_nlsui_main".
1>sap_connect0r_v001.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_RfcCreateFunction@8" in Funktion "_nlsui_main".
1>sap_connect0r_v001.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_RfcGetFunctionDesc@12" in Funktion "_nlsui_main".
1>sap_connect0r_v001.obj : error LNK2019: Verweis auf nicht aufgelöstes externes Symbol "_RfcOpenConnection@12" in Funktion "_nlsui_main".
1>LINK : error LNK2001: Nicht aufgelöstes externes Symbol "_NtProcessStartup".
1>Y:\Stargate\PIB\sap_connector_proj\sap_connect0r_v001\Debug\sap_connect0r_v001.exe : fatal error LNK1120: 10 nicht aufgelöste externe Verweise.
Erstellen: 0 erfolgreich, Fehler bei 1, 0 aktuell, 0 übersprungenIch habe es mit verschiedenen IDE's, verschiedenen Betriebsysteme(Windows 7 und XP) versucht. Mit verschiedenen Versionen von Visual Studio und sogar verschiedenen Compilern es nützt alles nichts.
Ich habe alles gemacht was hier steht: http://www.hightech-journal.net/externe-libraries-in-c-und-visual-studio-2010-einbinden um die libs und Header einzubinden, aber es scheint immer noch ein Fehler beim Linken zu sein bzw. beim einbinden der lib von SAP.
Was mache ich falsch bzw. was kann ich noch probieren mir fehlen so langsam die Ideen.Ich wäre für jeden Hinweis sehr dankbar.
-
Hi,
die Linkerfehler deuten darauf hin, dass die Implementierungen der Funktionen nicht gefunden werden können. Das heißt erstmal, dass wohl nicht alle notwendigen LIBs eingebunden worden sind.
Welche LIBs hast Du denn drin? Vermutlich gibt es irgendeine für RFCs.
-
Die beiden Warnungen bzgl der Subsystem-Einstellungen und die Funktion "_nlsui_main" sieht so aus als ob es sich da garnicht um natives C++ handelt. Ohne Code kann man dir aber auch nicht wirklich viel sagen. Hast du ein Tutorial zu dem Framework, das du da benutzt, mal durchgespielt?
-
bist du sicher, dass SAP-Release und SAP RFC SDK-Version zusammenpassen?
Wenn du mit Visual Studio arbeitest, als was hast du dein Programm erstellt? Win32-Anwendung?
Ansonsten findet sich im SDN einiges über RFC SDK (im OSS leider weniger)
-
pumuckl schrieb:
Die beiden Warnungen bzgl der Subsystem-Einstellungen und die Funktion "_nlsui_main" sieht so aus als ob es sich da garnicht um natives C++ handelt. Ohne Code kann man dir aber auch nicht wirklich viel sagen. Hast du ein Tutorial zu dem Framework, das du da benutzt, mal durchgespielt?
Hallo Leute vielen Dank für so viele Antworten. Hier mein Code:
// sap_connect0r_v001.cpp : Definiert den Einstiegspunkt für die Konsolenanwendung. // #include "include\sapnwrfc.h" #include <stdlib.h> #include <stdio.h> void errorHandling(RFC_RC rc, SAP_UC description[], RFC_ERROR_INFO* errorInfo, RFC_CONNECTION_HANDLE connection) { printfU(cU("%s: %d\n"), description, rc); printfU(cU("%s: %s\n"), errorInfo->key, errorInfo->message); // It's better to close the TCP/IP connection cleanly, than to // just let the backend get a "Connection reset by peer" error... if (connection != NULL) RfcCloseConnection(connection, errorInfo); exit(1); } int mainU(int argc, SAP_UC** argv) { RFC_RC rc = RFC_OK; RFC_CONNECTION_PARAMETER loginParams[6]; RFC_ERROR_INFO errorInfo; RFC_CONNECTION_HANDLE connection; RFC_FUNCTION_DESC_HANDLE bapiCompanyDesc; RFC_FUNCTION_HANDLE bapiCompany; RFC_STRUCTURE_HANDLE returnStructure; SAP_UC message[221]; RFC_BYTE buffer[1105]; unsigned utf8Len = 1105, resultLen; FILE* outFile; // ----------------------------------------------- // OPEN CONNECTION // ----------------------------------------------- // Create logon parameter list loginParams[0].name = cU("ashost"); loginParams[0].value = cU("hs0023"); loginParams[1].name = cU("sysnr"); loginParams[1].value = cU("05"); loginParams[2].name = cU("client"); loginParams[2].value = cU("800"); loginParams[3].name = cU("user"); loginParams[3].value = cU("alice"); loginParams[4].name = cU("lang"); loginParams[4].value = cU("EN"); loginParams[5].name = cU("passwd"); loginParams[5].value = cU("secret"); // Open connection connection = RfcOpenConnection(loginParams, 6, &errorInfo); if (connection == NULL) errorHandling(rc, cU("Error during logon"), &errorInfo, NULL); //----------------------------------------------- // DYNAMIC METADATA retrieval (can also be executed using STATIC functions) //----------------------------------------------- bapiCompanyDesc = RfcGetFunctionDesc(connection, cU("BAPI_COMPANY_GETDETAIL"), &errorInfo); if (bapiCompanyDesc == NULL) errorHandling(rc, cU("Error during metadata lookup"), &errorInfo, connection); // ----------------------------------------------- // FUNCTION CALL // ----------------------------------------------- // Create function instance bapiCompany = RfcCreateFunction(bapiCompanyDesc, &errorInfo); // Parameter setting RfcSetChars(bapiCompany, cU("COMPANYID"), cU("000007"), 6, &errorInfo); // Call rc = RfcInvoke(connection, bapiCompany, &errorInfo); if (rc != RFC_OK) errorHandling(rc, cU("Error calling BAPI_COMPANY_GETDETAIL"), &errorInfo, connection); // Getting parameters RfcGetStructure(bapiCompany, cU("RETURN"), &returnStructure, &errorInfo); RfcGetString(returnStructure, cU("MESSAGE"), message, 221, &resultLen, &errorInfo); // After having finished the procedure: release memory only if a // ‘create’ function was invoked before RfcDestroyFunction(bapiCompany, &errorInfo); // Final UTF8-UTF16 conversion // windows.h utf8Len = WideCharToMultiByte(CP_UTF8, 0, message, strlenU(message), buffer, 1105, NULL, NULL); // RfcSAPUCToUTF8(message, strlenU(message), buffer, &utf8Len, // &resultLen, &errorInfo); // outFile = fopen("message.xml", "w"); // fputs("<?xml version=\"1.0\"?>\n<message>", outFile); // fputs(buffer, outFile); // fputs("</message>", outFile); // fclose(outFile); return 0; }
Vielleicht hilft dieses Code-Beispiel zu verstehen was ich falsch mache. Diesen habe ich aus einem Tutorial bzw. Beispiel zum Testen übernommen. Aber ich glaube am Code liegt es nicht wenn dann an den Einstellungen von Visual Studio oder am Compiler.
Danke im Voraus
-
Wie und welche LIBs hast Du denn eingebunden?
-
Ich habe die benötigte lib Datei von der SAP eingebunden. Die heißt sapnwrfc.lib.
Ich habe es so gemacht wie im Tutorial erklärt wird, welchen ich in meinem ersten Beitrag gepostet habe.Bitte hilft mir die die lib richtig einzubinden.!! Ich versuch es schon seit Tagen.
-
Also entweder gibt es noch mehr LIBs oder Du hast die nicht richtig eingebunden...
Rechte Maustaste auf Projekt -> Eigenschaften -> Linker -> Eingabe -> Zusätzliche Abhängigkeiten -> Libnamen hinschreiben (entweder mit absolutem Pfad oder mit relativem Pfad nebst VC++-Verzeichnis-Angabe)
-
Hallo,
die Libs sind 1000fach benutzt und ok, demnach muß irgendwas in Deinen Visual Studio Einstellungen nicht stimmen.Hier gibt es ein Tutorial (inklusive Beispiel für die nötigen Visual Studio Einstellungen im ersten Teil). Läuft bei mir einwandfrei.
Part I -- RFC Client Programming
http://www.sdn.sap.com/irj/sdn/index?rid=/library/uuid/302f1a30-f4cb-2c10-e985-c8a280a96e43
Part II -- RFC Server Programming
http://www.sdn.sap.com/irj/sdn/index?rid=/library/uuid/b02b0719-4ccc-2c10-71ab-fe31483e466fPart III -- Advanced Topics
http://www.sdn.sap.com/irj/sdn/index?rid=/library/uuid/5070f62a-6acd-2c10-8cb5-858ef06adbb9Für VS 2010 solltest Du außerdem noch Hinweis 1056696 beachten: die U-Funktionen (printfU usw.) dürfen nicht benutzt werden und sollten durch die entsprechenden Standard-Unicode Funktionen von Microsoft ersetzt werden (_wprintf usw.), sonst crasht es...
Bei VS 2005 gibt es diese Inkompatibilität nicht.
-
Vielen Dank an Lanzelot und allea naderen, jetzt klappt es. Es lag tatsächlich an meinen Einstellungen für Visual Studio.
Also Danke an alle für die vielen Antworten und die Hilfe.
-
Ich steh vor dem gleichen Problem. Welche Projekteinstellungen waren bei dir falsch?
-
Hallo alreemmi,
würdest du mir deine Projekt-Einstellungen verraten?
Schon mal vielen Dank!