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
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
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.
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
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();
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
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 🙂