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;                 } 
       
      
     | 
   
   
   |