Laden...

Auf externe DLL zugreifen

Erstellt von baci vor 19 Jahren Letzter Beitrag vor 19 Jahren 5.016 Views
B
baci Themenstarter:in
4 Beiträge seit 2005
vor 19 Jahren
Auf externe DLL zugreifen

Hallo Leute,

ich schreibe gerade einen asp.net programm für meine Diplomarbeit und benötige drigend hilfe, den folgenden codebeispiel (c++) in c# umzusetzen. Ich habe vor kurzem mit c# angefangen und verstehe nicht soviel davon:

Ich danke allen die mir weiterhelfen.

hier der Fall:

Ich muss von meinen asp.net (erstellt mit c#) programm auf eine DLL zugreifen, um auf die Datenbank des Programmes Omnitracker Daten reinzuschreiben. Für den Zugriff gibt es eine c++ Beispiel:

IOtApplicationPtr pApp;
HRESULT hr = pApp.CreateInstance(__uuidof(OtApplication), NULL,
CLSCTX_INPROC_SERVER);
if (FAILED(hr))
{
CString str;
str.Format ("CreateInstance() failed: 0x%08lx",
(ULONG) hr);
AfxMessageBox (str);
}

try {
IOtSessionPtr pSession;
pSession = pApp->MakeSession("hostname", 4567,
"superuser", "password");

IOtUsersPtr pUsers;
pUsers = pSession->Users;

IOtUserPtr pUser;
pUser = pUsers->Add();
pUser->LoginName = "mary";
pUser->EmailAddress = "mary@company.com";
pUser->Password = "65gh45";
pUser->DisplayName = "Mary";
pUser->Save();

} catch(_com_error& e) {
_bstr_t bstrDescription(e.Description());
AfxMessageBox((LPCTSTR) bstrDescription);
}

und in der InitInstance() soll das stehen:

HRESULT hr = CoInitialize(NULL);
if (FAILED(hr))
{
AfxMessageBox ("Cannot initialize COM!");
return FALSE;
}

Bitte dringend um Hilfe!

mfg

baci

49.485 Beiträge seit 2005
vor 19 Jahren

Hallo baci,

man kann mit DllImport schon auf Funktionen in externen DLLs zugreifen (Forumssuche 'DllImport'). Aber ich habe absichtlich 'Funktionen' und nicht 'Methoden' geschrieben. Ich denke auf eine C++-DLL von C# zuzugreifen wird echt schwierig. Gibt es dafür keine C-Schnittstelle?

herbivore

M
456 Beiträge seit 2004
vor 19 Jahren

Auf normale C+ Klassen zugreifen gehtleider nicht so ohne weiteres von C# aus, da es bei C++ kein einheitliches Binärformatformat gibt. Du müsstest erst C Wrapper schreiben die die Klassen Kkapseln und dann per PInvoke darauf zugreifen.

Dein abgebildeter Code scheint ein COM-Interface zu sein. Bei .NET gibt es Möglichkeit einen Wrapper für COM-Schnittstellen automatisch zu erzeugen, wenn du die Typinformationen hast. In Visual Studio/SharpDevelop kannst du das bei "Referenzen hinzufügen" machen (COM-Reiter).

I am Jack's smirking revenge.
I am Jack's raging bile duct.
I am Jack's cold sweat.
I am Jack's complete lack of surprise.
I am Jack's broken heart.
I am Jack's wasted life.

B
baci Themenstarter:in
4 Beiträge seit 2005
vor 19 Jahren

Hi,

es wird von dem Programm eine .tlb-Datei zur Verfügung gestellt. Diese habe ich jetzt als Verweis hinzugefügt, aber wie geht es jetzt weiter???

thx.

baci

B
baci Themenstarter:in
4 Beiträge seit 2005
vor 19 Jahren

Hi,

es ist mir gelungen eine Session zu erzeugen, d.h. ich greife auf die Datenbank des Omnitrackers zu.
Lösung:

IOtApplication pApp = new OtAut.OtApplicationClass();
pApp.MakeSession("ENES", 5085, "basri", "test");

aber wenn ich den rest hinschreibe, bekomme ich die Meldung: Auf "OtAut.OtSession.OtSessionClass()" ist der Zugriff aufgrund der Sicherheitseben nicht möglich?? Was mach ich falsch?

Rest:
IOtSession pSession = new OtAut.OtSessionClass();

IOtUsers pUsers = new OtAut.OtUsersClass();
pUsers = pSession.Users;
IOtUser pUser = new OtAut.OtUserClass();
pUser = pUsers.Add();
pUser.LoginName="basri";
pUser.EmailAddress="badri@company.de";
pUser.Password ="test";
pUser.DisplayName="Baci";
pUser.Save();

P
939 Beiträge seit 2003
vor 19 Jahren

Nur das IOtSession-Interface ist sichtbar, nicht aber die implementierende Klasse OtSessionClass. Warum soll die Session auf einmal mit new erzeugt werden? Analog zum Code oben müsste es heissen:

IOtSession pSession = pApp.MakeSession("ENES", 5085, "basri", "test");

Das "p"-Präfix für Pointer würde ich in C#-Code aber weglassen.

Gruss
Pulpapex

B
baci Themenstarter:in
4 Beiträge seit 2005
vor 19 Jahren

hi,

ich danke euch vielmals. Ich kann jetzt reinschreiben. Ich werde jetzt versuchen einen Problem (Request) zu erstellen. Sollte ich Probleme haben, weiss ich jetzt, wer mir helfen kann.

thanks again.

baci

und p werde ich weglassen 🙂