none
API kald fra C5

    Spørgsmål

  • Er der nogle der kender noget til API kald fra C5, eventuelt ved hvor man finder noget dukomentation eksempler eller andet der kan hjælpe mig videre.

    /Kim

    21. juni 2011 09:57

Svar

  • Hej Kim,

    Alt efter hvordan dit API er strikket sammen, kan du enten bruge DLL kald, ellers skal du kalde en COM service.
    Hvis det er en DLL, som er managed code (det er typisk C+/C++ og lignende, eller .net med en wrapper DLL), kan du sakse meget af din kode, fra den måde C5 3.0 SP3 og 4.0 kaldte Word og Excel. Nemlig via et par DLL'er skrevet til formålet.

    Er det COM, skal din C5 være 2008 eller nyere, da det var her COM service kald blev introduceret fra Microsoft. Kaldene er lidt sværere at strikke sammen, men mulighederne er flere, da man ikke er begrænset af den specifikke DLL der skal være skrevet til formålet.
    Bemærk, at com servicen skal være registreret på PC'en der bruges til formålet. Brug evt. RegDLLView fra http://www.nirsoft.net til at se om din service er registreret korrekt. Findes den ikke i oversigten, kan C5 ikke kalde den.
    Et eksempel på et simpelt kald, til en test service "C5ComTest.C5Test":

    //Nedenstående eksempel kalder COM Servicen C5ComTest og klassen C5Test
    //Der findes én funktion i servicen: Calc.
    //Calc tager 2 tal og returnerer dem lagt sammen

    #MacroLoad(COMAPI_TYPES)
    #MacroLoad(COMAPIUTIL)

    STR 50 &HCOM
    STR 50 &CalcR
    SET &HCOM = COMCreate(0,'C5ComTest.C5Test','',0)
    #ShowError(&HCOM,&CMD+':'+'COMCreate')
    IF (&HCOM == '') THEN
        #Add(&API_Err_Num,1)
        SET BOX(2,StrFmt("Kritisk fejl ved kald til %1",'C5ComTest'),0)
        SET &API_Err_Log[&API_Err_Num] = StrFmt("Kritisk fejl ved kald til %1",'C5ComTest')
    ENDIF

    //Dette kald er nødvendigt inden der kaldes ny funktion i servicen
    SET COMPush(&HCOM, &HCOM)

    //Her sendes varianter med, kig i COMAPI_TYPES, for at se mulighederne
    SET COMPushVariant(&HCOM, #COMAPI_IntType, "20")
    SET COMPushVariant(&HCOM, #COMAPI_IntType, "47")

    //Nu kaldes selve regne funktionen, 2 tallet fortæller vi har 2 parametre med
    SET &HR = COMGet(&HCOM, 'Calc', 2)
    SET &CalcR = COMTopVariant(&HCOM,130)
    PRINT "Her kommer resultat: ",&CalcR PAUSE

    SET &HR = COMRelease(&HCOM)
    SET &HCOM = ''

     

    Mvh.
    Mads W

    9. august 2011 07:38

Alle besvarelser

  • Hej Kim,

    Hvad har du mere præcist i tankerne?


    Venlig Hilsen Henrik Hansen Program Manager II Microsoft Dynamics C5
    22. juni 2011 05:50
    Ejer
  • Hej Henrik

    Sorry, den sene reaktion - der kom en ferie i vejen.

    Jeg har behov for fra C5 at kunne hente og skrive data til en anden applikation (ServiceSuite) herfra har jeg fået udleveret noget dokumentation til deres API modul.

    Jeg går udfra at det er DLL-funktionerne i C5 jeg skal bruge, men det er ikke meget dokumentation hjælpen i c5 giver fra sig, så jeg søger noget mere dokumentation / eksempler (faktisk står der i hjælpen i C5 at der ligger eksempler på i Develop mappen på XAL (?) installations cd'en - dem kan jeg ikke finde (heller ikke på min gamle XAL 3,5 installation)

    På forhånd tak for hjælpen.

    /Kim

    1. august 2011 08:53
  • Hej Kim,

    Send mig en mail ved at fjerne "online" fra mit alias, så kan jeg sende dig den gamle Develop mappe som zip-fil.

     


    Venlig Hilsen Henrik Hansen Program Manager II Microsoft Dynamics C5
    1. august 2011 14:58
    Ejer
  • Hej Kim,

    Alt efter hvordan dit API er strikket sammen, kan du enten bruge DLL kald, ellers skal du kalde en COM service.
    Hvis det er en DLL, som er managed code (det er typisk C+/C++ og lignende, eller .net med en wrapper DLL), kan du sakse meget af din kode, fra den måde C5 3.0 SP3 og 4.0 kaldte Word og Excel. Nemlig via et par DLL'er skrevet til formålet.

    Er det COM, skal din C5 være 2008 eller nyere, da det var her COM service kald blev introduceret fra Microsoft. Kaldene er lidt sværere at strikke sammen, men mulighederne er flere, da man ikke er begrænset af den specifikke DLL der skal være skrevet til formålet.
    Bemærk, at com servicen skal være registreret på PC'en der bruges til formålet. Brug evt. RegDLLView fra http://www.nirsoft.net til at se om din service er registreret korrekt. Findes den ikke i oversigten, kan C5 ikke kalde den.
    Et eksempel på et simpelt kald, til en test service "C5ComTest.C5Test":

    //Nedenstående eksempel kalder COM Servicen C5ComTest og klassen C5Test
    //Der findes én funktion i servicen: Calc.
    //Calc tager 2 tal og returnerer dem lagt sammen

    #MacroLoad(COMAPI_TYPES)
    #MacroLoad(COMAPIUTIL)

    STR 50 &HCOM
    STR 50 &CalcR
    SET &HCOM = COMCreate(0,'C5ComTest.C5Test','',0)
    #ShowError(&HCOM,&CMD+':'+'COMCreate')
    IF (&HCOM == '') THEN
        #Add(&API_Err_Num,1)
        SET BOX(2,StrFmt("Kritisk fejl ved kald til %1",'C5ComTest'),0)
        SET &API_Err_Log[&API_Err_Num] = StrFmt("Kritisk fejl ved kald til %1",'C5ComTest')
    ENDIF

    //Dette kald er nødvendigt inden der kaldes ny funktion i servicen
    SET COMPush(&HCOM, &HCOM)

    //Her sendes varianter med, kig i COMAPI_TYPES, for at se mulighederne
    SET COMPushVariant(&HCOM, #COMAPI_IntType, "20")
    SET COMPushVariant(&HCOM, #COMAPI_IntType, "47")

    //Nu kaldes selve regne funktionen, 2 tallet fortæller vi har 2 parametre med
    SET &HR = COMGet(&HCOM, 'Calc', 2)
    SET &CalcR = COMTopVariant(&HCOM,130)
    PRINT "Her kommer resultat: ",&CalcR PAUSE

    SET &HR = COMRelease(&HCOM)
    SET &HCOM = ''

     

    Mvh.
    Mads W

    9. august 2011 07:38
  • Hej Mads

    Tusinde tak for eksemplerne, det førte mig noget videre.

    /Kim

    11. august 2011 19:42
  • Hej igen Kim,

    Det er godt at høre du kan bruge det.


    -->Henrik Hansen, det kunne være vi skulle have nogle noget mere lavpraktiske eksempler som det jeg har givet Kim her, når der komme helt ny funktionalitet til C5?

    Det er i hvert fald et ønske fra min side. :)

    Mvh
    Mads W.

    15. august 2011 11:01