Check alle échte Black Friday-deals Ook zo moe van nepaanbiedingen? Wij laten alleen échte deals zien

[clarion / C#] Clarion DLL in C#

Pagina: 1
Acties:
  • 145 views sinds 30-01-2008
  • Reageer

  • InfInIte
  • Registratie: Mei 2002
  • Laatst online: 13-06-2022
Ik heb een .DLL file die gemaakt is in/met Clarion.
Die .DLL file wil ik gebruiken in een C# project, maar het probleem is dat ik het niet voor elkaar krijg om een functie uit die DLL file aan te roepen.
Het lijkt te komen door de manier waarop Clarion de DLL file opbouwt.

Ik heb gezocht op internet maar het probleem is dat er vrijwel niets (bruikbaars) over te vinden is.
Ik hoop dat hier iemand is die weet hoe ik dit kan doen.

Als ik meteen dll explorer in de dll file kijk vind ik de feunctie die ik wel gebruiken als volgt terug:
Ordinal: B6C
Functionname: COMBINEER@FOsbOsbOsb
Entry point: 10FF5C

Ik heb wat dingen geprobeerd met Dllimport, maar zonder succes.
Dit zijn 2 van de dingen die ik heb geprobeerd.

code:
1
2
[DllImport("test.dll")]
public static extern string combineer(string City, string State, string Zip);
code:
1
2
[DllImport("test.dll", EntryPoint = "10FF5C")]
public static extern string combineer(string City, string State, string Zip);


De eerste geeft een melding "unable to find entry point 'combineer' in DLL 'test.dll'" bij het uitvoeren van die functie.
De tweede geeft een melding "unable to find entry point '10FF5C' in DLL 'test.dll'" bij het uitvoeren van die functie.

Wat ik dus eigenlijk wil weten is welke stappen ik moet ondernemen om die .DLL file in C# te kunnen gebruiken. Op welke manier maakt niet zo veel uit, als het maarwerkt.

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 30-11 19:45

TeeDee

CQB 241

Je zou kunnen proberen:
C#:
1
2
[DllImport("test.dll", EntryPoint = "COMBINEER")]
public static extern string combineer(string City, string State, string Zip);


Misschien dat je met P/Invoke iets kan doen. Als het trouwens de Clarion is die ik denk dat het is, dan is er afaik ook een Clarion.NET variant.

heb je ook "using System.Runtime.InteropServices;" gebruikt?

[ Voor 39% gewijzigd door TeeDee op 05-07-2007 14:26 ]

Heart..pumps blood.Has nothing to do with emotion! Bored


  • InfInIte
  • Registratie: Mei 2002
  • Laatst online: 13-06-2022
Die manier had ik ook geprobeerd, ik krijg dan "unable to find entry point 'COMBINEER' in DLL 'test.dll'"
De DLL is gemaakt met Clarion 6.3.

  • TeeDee
  • Registratie: Februari 2001
  • Laatst online: 30-11 19:45

TeeDee

CQB 241

Weet je zeker dat in de dll de verschillende methods wel beschikbaar zijn gemaakt?
Is de 'Name mangling' wel goed?

Of te wel, als je als EntryPoint "COMBINEER@FOsbOsbOsb" gebruikt, krijg je dan wel resultaten?
InfInIte schreef op donderdag 05 juli 2007 @ 14:52:
Nee, dat weet ik niet zeker. Hoe kan ik dat zien in Clarion?
Ik ben niet zo bekend met Clarion, ik werk meer met .NET.

ps. Clarion.net is nog niet beschikbaar.
Geen idee, ik haal de informatie ook maar van Google.

[ Voor 95% gewijzigd door TeeDee op 05-07-2007 14:54 ]

Heart..pumps blood.Has nothing to do with emotion! Bored


  • InfInIte
  • Registratie: Mei 2002
  • Laatst online: 13-06-2022
Nee, dat weet ik niet zeker. Hoe kan ik dat zien in Clarion?
Ik ben niet zo bekend met Clarion, ik werk meer met .NET.

ps. Clarion.net is nog niet beschikbaar.


Als ik "COMBINEER@FOsbOsbOsb" als entry point instel in mijn C# programmatje en ik start hem vanuit VS dan sluit hij gelijk weer zonder enige melding.
Ik zie in dat documentje wat clarion code dingetjes staan, ik ga daar even mee stoeien.

laatste edit:
Het is gelukt met de voorbeelden uit dat document :)

[ Voor 50% gewijzigd door InfInIte op 05-07-2007 15:54 . Reden: gelukt ]


  • Woy
  • Registratie: April 2000
  • Niet online

Woy

Moderator Devschuur®
Mischien leuk om de oplossing te posten van wat je nou verkeerd deed. Daar heeft een volgende bezoeker mischien nog wat aan.

“Build a man a fire, and he'll be warm for a day. Set a man on fire, and he'll be warm for the rest of his life.”


  • InfInIte
  • Registratie: Mei 2002
  • Laatst online: 13-06-2022
Bij de functie prototype had ik geen ',Pascal' aan het eind, wat blijkbaar nodig is omdat Clarion parameters standaard van links naar rechts op de stack zet ipv. van rechs naar links.

verder had ik 'TempString CString(100)' en 'x# = lstrcpy(Address(TempString),Prm:Long)' niet in mijn Clarion code staan om de vanuit C# meegegeven parameters in te lezen.

  • InfInIte
  • Registratie: Mei 2002
  • Laatst online: 13-06-2022
Ik ben een aardig stukje opweg gekomen, maar loop nu tegen een probleempje aan.
Zo nu en dan krijg ik als ik een methode uit die Clarion dll aanroep een "Attempted to read or write protected memory" fout.

Dit is mijn DLLimport:
C#:
1
2
[DllImport("C:\\callcw.dll", EntryPoint = "getKlantbyID")]
public static extern ulong getKlantbyID(string companyid, string klantid);

En zo roep ik hem aan:
C#:
1
string xmlPath = getKlantbyID(companyid, klantnummer).ToString();
companyid en klantnummer zijn bijde van het type 'string'.

Dit is het prototype van die methode in Clarion:
C#:
1
getKlantbyID(Long, Long),String,Pascal
Pagina: 1