[C#]Delphi 7 DLL functie aanroep doet niets

Pagina: 1
Acties:

  • Arie-Kanarie
  • Registratie: Juli 2004
  • Laatst online: 02-04 14:03

Arie-Kanarie

Een keer wat anders

Topicstarter
Hallo

Ik heb een Delphi 7 dll gekregen met een programmatje erbij dat gebruikt maakt van die dll. Dit werkt natuurlijk geweldig.
Maar nu wil/moet ik een eigen programma in C# schrijven dat ook gebruik maakt van deze dll.
Eerst heb ik geprobeerd in VS.Net 2003 die dll toe te voegen via Add Refrence. Dit werkte niet omdat het geen goede dll was of geen goed com component aldus Visual Studio.
Toen maar op zoek gegaan naar informatie over managed en unmanaged code. Genoeg gevonden. Voorbeeld van MSDN gevolgt, gerund maar als ik op de knop druk die de methode in de dll aan moet roepen, gebeurt er niets. Overige acties (ervoor en ernaar) worden uitgevoerd, alles staat in try catch blok maar ik krijg geen foutmeldingen.
De delphi functie in de dll is als volgt
Delphi:
1
2
3
4
function SendCommand(Host: shortstring; Port: integer;
Data: shortstring; Version, MessageType: integer;
Key: shortstring; ReadDataProc: TReadDataProc;
CustID: integer): integer;

Het zijn allemaal gewone input variabelen. Op de ReadDataProc na, deze retourneert iets (als ik het goed begrijp uit de handleiding).
Hierover zegt de documentatie bij de dll:
ReadDataProc
Callback procedure. The procedure which is called to return decrypted received
data to the host application.
Format:
code:
1
TReadDataProc = procedure(IP, Response: shortstring);


Mijn C# code is als volgt (gebaseerd op het voorbeeld van MSDN):
code:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
// Buiten de klasse, binnen de namespace declaar ik
public delegate bool TReadDataProc(string IP, string Response);

//Vervolgens net na de main declareer ik
[DllImport("ANEXP")]
        public static extern int SendXCPCommand(string Host, int Port, string Data, int XcpVersion, int MessageType, string XcpKey, TReadDataProc ReadDataProc, int CustomerID);

//Daarna wordt in de click van een button
private void button1_Click(object sender, System.EventArgs e)
        {
            try 
            {
                TReadDataProc ProcessIncoming = new TReadDataProc(Form1.ShowResult);
                SendXCPCommand1(txtHost.Text, int.Parse(txtPort.Text), txtData.Text, int.Parse(txtVersion.Text), int.Parse(txtMessageType.Text), txtKey.Text, ProcessIncoming, int.Parse(txtCustID.Text));
            }
            catch (Exception fout)
            {
                MessageBox.Show(fout.Message + "\n" + fout.StackTrace);
            }
        }

//Daarna komt de methode
        public static bool ShowResult(string IP, string Response)
        {
            MessageBox.Show("ProcessIncoming(\"" + IP + "\", \"" + Response + "\");");
            return true;
        }


Volgens mij gaat er iets niet goed bij het retourneren van de waarde, of het opvangen daarvan. Als ik de functie naam aan pas (onder het DllImport attribuut) dan krijg ik wel de error dat de functie niet gevonden is. De code vind de methode in de dll dus wel, dan wel heeft door dat een methode niet aanwezig is in de dll.
Ik hoop dat iemand ziet wat hier fout gaat.
Mocht er meer info nodig zijn dan hoor ik het graag en als ik een oplossing heb gevonden dan zal ik die hier ook melden. Alvast bedankt voor de tips/oplossingen

[ Voor 9% gewijzigd door Arie-Kanarie op 26-01-2006 15:26 . Reden: Wat extra info toegevoegd ]

Software ontwikkelen in de Achterhoek voor leuke klanten door heel Nederland? Klik hier


  • Lethalis
  • Registratie: April 2002
  • Niet online
[edit] Argh, ben niet helemaal wakker.

Probeer eens StringBuilder te gebruiken ipv string voor je params.

Volgens mij kon je trouwens sowieso geen functiepointers doorgeven met pinvoke.. maar pin mij er niet op vast :X

[ Voor 170% gewijzigd door Lethalis op 26-01-2006 15:21 ]

Ask yourself if you are happy and then you cease to be.


Verwijderd

Arie-Kanarie schreef op donderdag 26 januari 2006 @ 14:57:
Ik heb een Delphi 7 dll gekregen met een programmatje erbij dat gebruikt maakt van die dll. Dit werkt natuurlijk geweldig.

De delphi functie in de dll is als volgt
Delphi:
1
2
3
4
function SendCommand(Host: shortstring; Port: integer;
Data: shortstring; Version, MessageType: integer;
Key: shortstring; ReadDataProc: TReadDataProc;
CustID: integer): integer;


Ik hoop dat iemand ziet wat hier fout gaat.
Check ook ff de "calling convention" (Google)

  • H!GHGuY
  • Registratie: December 2002
  • Niet online

H!GHGuY

Try and take over the world...

dit lees ik in de MSDN bij "implementing callback functions" (bij platform invoke):
If, however, the callback function can be invoked after the call returns, the managed caller must take steps to ensure that the delegate remains uncollected until the callback function finishes. For detailed information about preventing garbage collection, see Interop Marshaling with Platform Invoke.
weet je dus zeker dat die callback niet gecollect wordt door je GC ?

ASSUME makes an ASS out of U and ME


  • Arie-Kanarie
  • Registratie: Juli 2004
  • Laatst online: 02-04 14:03

Arie-Kanarie

Een keer wat anders

Topicstarter
Alle drie alvast bedankt voor de tips en/of info.
Denk wel dat ik er iets mee kan. Heb nu nog geen tijd om te testen, dus of het werkt horen jullie later. Nieuwe tips/inzichten zijn natuurlijk altijd welkom.

Software ontwikkelen in de Achterhoek voor leuke klanten door heel Nederland? Klik hier