Avatar billede Slettet bruger
26. april 2010 - 11:27 Der er 6 kommentarer og
1 løsning

C++ og C# DLL

Hejsa :)

Jeg er ved at skrive en "foreign routine" (C++ dll) til Saber Simulator.
Saber Simulator tager imod en C++ DLL hvis den har denne header:

extern "C" _declspec(dllexport) void X2_X3(
double* in,long* nin,double* ifl,long* nifl,double* out,
long* nout,double* ofl,long* nofl,double* undef,long* ier)

Saber Simulator bruger sproget MAST til at køre min C++ DLL.

Jeg kan godt få Saber til at vise en INTEGER hvis jeg returnerer den fra min C++ DLL, problemet er bare når jeg vil returnere data fra min C# DLL som min C++ dll er kodet sammen med. Så bliver output altid lig med 0.

Her er min kode:

C++ DLL:

#import "C:\Users\test\Desktop\SaberDllProjekt\DatabaseDLL\bin\Debug\DatabaseDLL.tlb" raw_interfaces_only

using namespace DatabaseDLL;

extern "C" _declspec(dllexport) void X2_X3(
double* in,long* nin,double* ifl,long* nifl,double* out,
long* nout,double* ofl,long* nofl,double* undef,long* ier)

{

double input= in[0];

HRESULT hr = CoInitialize(NULL);

iDatabaseDLLPtr piDatabaseDLL(__uuidof(ManagedDatabaseDLL));

double result;

hr = piDatabaseDLL->HentDatabaseDLL(input, &result);

CoUninitialize();

out[0] = result;

}


C# DLL:

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data.SqlClient;
using System.Data.SqlTypes;
using System.Runtime.InteropServices;

namespace MinDatabaseDLL
{

    public interface iDatabaseDLL
    {

        double HentDatabaseDLL
            (

          double MotorID
            );
    }

    public class ManagedDatabaseDLL : iDatabaseDLL
    {
       

        public double HentDatabaseDLL
            (
          double MotorID
            )

        {
            double motorID = 0;
            double tempMotorID = 0;

            SqlConnection thisConnection = new SqlConnection(@"udkommenteret;");

            SqlCommand thisCommand = thisConnection.CreateCommand();

            thisCommand.CommandText = "SELECT * FROM Motor.dbo.MotorData WHERE MotorID = @MotorID";

            thisCommand.Parameters.AddWithValue("@MotorID", MotorID);

            thisConnection.Open();

            SqlDataReader thisReader = thisCommand.ExecuteReader();

            while (thisReader.Read())
            {
                try
                {
                    tempMotorID = (thisReader.GetInt32(thisReader.GetOrdinal("MotorID")));
                }
                catch (SqlNullValueException)
                {
                }
            }

            motorID = tempMotorID;

            thisConnection.Close();

            return motorID;

        }


    }
}
Avatar billede bvli Praktikant
26. april 2010 - 13:09 #1
Du har en tom catch i den try hvor du tildeler tempMotorId en værdi. Mon ikke det er her du skal kigge? Du ville i øvrigt kunne optimere din databasetilgang, hvis du laver en ExecuteScalar i stedet.
Avatar billede Slettet bruger
26. april 2010 - 14:25 #2
Det er ikke selve sql forespørgslen der er problemet. Det er gennemtestet.

Når værdien fra databasen bliver returneret fra min c# dll til min c++ dll at værdien er 0.
Avatar billede Slettet bruger
26. april 2010 - 14:25 #3
hov, kom til at skrive som et svar
Avatar billede arne_v Ekspert
26. april 2010 - 15:58 #4
Hvorfor bruger du COM mellem din C++ kode og din C# kode ?

Det ville vaere noget nemmere ar bruge mixed mode C++ til at kalde din C# kode.
Avatar billede Slettet bruger
27. april 2010 - 07:13 #5
Ok, jeg er ikke en haj til c++ og det er første gang jeg "blander" c# og c++.

Når jeg debugger med en alm. c# konsol applikation kan jeg godt hente data fra c# dll og tilbage til mit konsol projekt.

Men så snart jeg fjerner mit konsol projekt og implementerer skidtet i Saber, så returnerer den 0.

Nogle gode links, guides til mixed mode c++? For så vil jeg prøve det istedet.
Avatar billede Slettet bruger
27. april 2010 - 10:23 #6
I mit TCL/MAST script implementerer jeg det således:

#====================Start på test
          message("\n")
          message("  Running DLL :-) \n")
          message("\n")
          myinput = 100
          message("\n")
          message("  Sending value: % \n", myinput)
          myoutput = X2_X3(myinput, 0, 0, 0, 0, 0, 0, 0, 0, 0)
          message("\n")
          message("  Receiving value: % \n", myoutput)
          message("\n")
#====================Slut på test
Avatar billede Slettet bruger
27. april 2010 - 12:35 #7
Jeg har fundet fejlen!

Det var et Win7 firewall issue!
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Kurser inden for grundlæggende programmering

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester