001
24.01.2016, 12:04 Uhr
DerSofti
|
Dann folgt die Testroutine dazu, hier zunächst die Deklaration der lokalen Variablen
C++: |
void __fastcall TForm1::ButtonTestStartenClick(TObject *Sender) { // Steuervariablen von Pascal übernommen int Result; _NCB NCB; LANA_ENUM Enum; ADAPTER_STATUS Adapter; int I, L, NameLen; std::string Machine, MachineName; // Adapter: AStat; // Eigene Steuervariablen zum Ersatz fehlender Funktionen aus Pascal int iCount1, iCount2; _NCB *ncbptr; LANA_ENUM *lanaptr; // ADAPTER_STATUS *adaptr;
#pragma pack(1) struct _Astat { ADAPTER_STATUS adapt; _NAME_BUFFER NameBuff[29]; }; _Astat Astat; _Astat *adaptr;
|
Hier der Quellcode der lokalen Test-Routine, die auskommentierten Befehle sind aus Pascal und dienen mir zur Orientierung, was gerade nach C++ übersetzt wird.
C++: |
NetBiosLib = 0; Machine = "TEST-PC"; MachineName = "TEST-PC"; if (MachineName == "") MachineName = "*"; NameLen = strlen(MachineName.c_str());
///////////////////////////////////////////////////////////////////////////// // L := NCBNAMSZ - NameLen; // if L > 0 then // begin // SetLength(MachineName, NCBNAMSZ); // FillChar(MachineName[NameLen + 1], L, ' '); // end;
L = NCBNAMSZ - NameLen; if (L > 0) { //memset(MachineName, NCBNAMSZ); for (iCount1 = NameLen; iCount1 < NCBNAMSZ; iCount1++) { // MachineName[iCount1] = ' '; MachineName.append(" "); } } /////////////////////////////////////////////////////////////////////////////
// MachineName[NCBNAMSZ] := #0; // ResetMemory(NCB, SizeOf(NCB)); // NCB.ncb_command := NCBENUM; // NCB.ncb_buffer := Pointer(@Enum); // NCB.ncb_length := SizeOf(Enum);
MachineName[NCBNAMSZ] = '\0'; ncbptr = &NCB; memset ( ncbptr , '\0' , sizeof ( NCB ) ); NCB.ncb_command = NCBENUM; lanaptr = &Enum; NCB.ncb_buffer = (UCHAR *)&Enum; NCB.ncb_buffer = (PUCHAR(&Enum)); // PUCHAR(isENABLED)^ := $00; // NCB.ncb_buffer = (UCHAR((System::Pointer) &Enum)); // System::Pointer(Enum); NCB.ncb_length = sizeof(Enum); /////////////////////////////////////////////////////////////////////////////
// function InitNetbios: Boolean; // begin // Result := True; // if NetBiosLib = 0 then // begin // NetBiosLib := SafeLoadLibrary('netapi32.dll'); // Result := NetBiosLib <> 0; // if Result then // begin // @_NetBios := GetProcAddress(NetBiosLib, PChar('Netbios')); // Result := @_NetBios <> nil; // if not Result then // ExitNetbios; // end; // end; // end;
if (NetBiosLib == 0) { NetBiosLib = SafeLoadLibrary(L"netapi32.dll"); // Laden der DLL if (Result) { Result = 0; _NetBios = (DLLFUNCTION*)::GetProcAddress((HMODULE)NetBiosLib, "Netbios"); // Laden der DLL-Funktion if (_NetBios != NULL) { Result = 0; } } }
/////////////////////////////////////////////////////////////////////////////
// if NetBios(@NCB) = NRC_GOODRET then // begin // Result := Enum.Length; // for I := 0 to Ord(Enum.Length) - 1 do // begin // ResetMemory(NCB, SizeOf(NCB)); // NCB.ncb_command := NCBRESET; // NCB.ncb_lana_num := Enum.lana[I]; // if NetBios(@NCB) = NRC_GOODRET then // begin // Result := Enum.Length; // for I := 0 to Ord(Enum.Length) - 1 do // begin // ResetMemory(NCB, SizeOf(NCB)); // NCB.ncb_command := NCBRESET; // NCB.ncb_lana_num := Enum.lana[I]; // if NetBios(@NCB) = NRC_GOODRET then // begin // ResetMemory(NCB, SizeOf(NCB)); // NCB.ncb_command := NCBASTAT; // NCB.ncb_lana_num := Enum.lana[I]; // Move(MachineName[1], NCB.ncb_callname, SizeOf(NCB.ncb_callname)); // NCB.ncb_buffer := PUCHAR(@Adapter); // NCB.ncb_length := SizeOf(Adapter); // if NetBios(@NCB) = NRC_GOODRET then // Addresses.Add(AdapterToString(@Adapter.adapt)); // end; // end; // end; // end;
if (_NetBios(&NCB) == NRC_GOODRET) // Start der DLL-Funktion mit Prüfung { Result = Enum.length; for (I = 0; I <Enum.length; I++) { NCB.ncb_command = NCBRESET; NCB.ncb_lana_num = Enum.lana[I]; if (_NetBios(&NCB) == NRC_GOODRET) { Result = 0; // ResetMemory(NCB, SizeOf(NCB)); // NCB.ncb_command := NCBRESET; memset ( ncbptr , '\0' , sizeof ( NCB ) ); NCB.ncb_command = NCBASTAT; NCB.ncb_lana_num = Enum.lana[I]; // Move(MachineName[1], NCB.ncb_callname, SizeOf(NCB.ncb_callname)); memcpy(NCB.ncb_callname, MachineName.c_str(), strlen(MachineName.c_str())); // NCB.ncb_buffer := PUCHAR(@Adapter); //(UCHAR *)&Enum; // NCB.ncb_buffer = PUCHAR(&Adapter); adaptr = &Astat; memset ( adaptr , '\0', sizeof ( Astat ) ); NCB.ncb_buffer = (UCHAR *)&Astat; // NCB.ncb_buffer = (UCHAR *)&Enum;
NCB.ncb_length = sizeof(Astat); NCB.ncb_length = 600; // NCB.ncb_buffer = (char far *)Adapter; // NCB.ncb_buffer = (PUCHAR far *)adaptr; // (char far *)&asb_buf; if (_NetBios(&NCB) == NRC_GOODRET) { Result = 0; }
} } } }
|
Hier ein Aufruf, der funktioniert mit der Struktur Enum:
C++: |
NCB.ncb_buffer = (UCHAR *)&Enum; NCB.ncb_buffer = (PUCHAR(&Enum)); .... if (_NetBios(&NCB) == NRC_GOODRET) // Start der DLL-Funktion mit Prüfung
|
Hier der Auruf, wo ich eine Access-Violation bekomme als Fehlermeldung und im CPU-Fenster lauter ??? anstatt Assemblerbefehle sind. Als Ursache vermute ich das mit dem Packed Record und habe gegoogelt, daß der Pendant zu Packed Record der Compiler-Befehl #pragma pack in C++ ist. Allerdings bekomme ich auch weiterhin denselben Fehler mit #Pragma pack, soll in die Klammer vielleicht die Größe der Struktur rein bei pack? Steh da gerade völlig auf dem Schlauch :/
C++: |
NCB.ncb_buffer = (UCHAR *)&Astat; // NCB.ncb_buffer = (UCHAR *)&Enum;
NCB.ncb_length = sizeof(Astat); NCB.ncb_length = 600; // NCB.ncb_buffer = (char far *)Adapter; // NCB.ncb_buffer = (PUCHAR far *)adaptr; // (char far *)&asb_buf; if (_NetBios(&NCB) == NRC_GOODRET) { Result = 0; }
|
|