1. Pascal / Говнокод #24872

    0

    1. 01
    2. 02
    3. 03
    4. 04
    5. 05
    6. 06
    7. 07
    8. 08
    9. 09
    10. 10
    11. 11
    12. 12
    13. 13
    14. 14
    15. 15
    16. 16
    17. 17
    18. 18
    19. 19
    20. 20
    21. 21
    22. 22
    23. 23
    24. 24
    25. 25
    26. 26
    27. 27
    28. 28
    29. 29
    30. 30
    31. 31
    32. 32
    procedure TMainForm.FormCreate(Sender: TObject);
    var
      s : String;
      reg : TRegistry;
    begin
      SetLength (s, Max_Path);
      SHGetSpecialFolderPath (0, PChar(s), CSIDL_COMMON_APPDATA, false);
      AppDataPath := s + '\Test\';
      ShowMessage (AppDATAPath);
    end;
    
    , где AppDataPath : string;
    Только вот в AppDataPath находиться только S, а должно быть s + '\Test\'
    Вопрос: Почему?
    Заранее благодарен
    
    
    
    Потому что нельзя передавать паскалевскую строку в виде PChar в функцию, которая будет её там модифицировать. Нужно делать так:
    
    Код:
    var
      s : array[ 0..MAX_PATH ] of Char;
      reg : TRegistry;
    begin
      s[ 0 ] := #0;
      SHGetSpecialFolderPath (0, s, CSIDL_COMMON_APPDATA, false);
      AppDataPath := s + '\Test\';
      ShowMessage (AppDATAPath);
    end;
    
    http://www.programmersforum.ru/showthread.php?t=84319

    @Потому что нельзя передавать паскалевскую строку в виде PChar в функцию, которая будет её там модифицировать.
    Ахуенно крутой спец по строкам.

    Кстати, https://primechaniya.ru/home/news/oktyabr-2018/v-tatarstane-18-podrostkov-otravilis-kitajskimi-duhami/

    Запостил: BagorCtretora, 08 Октября 2018

    Комментарии (63) RSS

    • Въебал минус ублюдку.
      Ответить
    • На "PHP", ублюдок!
      Ответить
    • "Ахуенно крутой спец по строкам."

      Кстати, а в чём ошибка? Почему не происходит конкатенация?
      Ответить
      • >>>"конкатенация"

        Что за дебильное слово? Почему не "контактация" (логично - контакт двух строк)?
        Ответить
      • I think I'll try to be cap...
        When you call the SetLength procedure, the string is extended. When SHGetSpecialFolderPath is called, writes to the string and puts a null character at the end of the data. The first character of the Pascal-string stored the length of the string, even you can have a zero character not even at the end of the data and in the middle, but you can not say this about ShowMessage, based on the API MessageBox, waiting for a zero character at the end of the string, means the end of the data. Thus, the string is simply truncated.
        Ответить
        • How can this be fixed, sir?
          Ответить
          • You should shorten the string to the actual length.

            procedure TMainForm.FormCreate(Sender: TObject);
            var
              s : String;
              reg : TRegistry;
            begin
              SetLength (s, Max_Path);
              SHGetSpecialFolderPath (0, PChar(s), CSIDL_COMMON_APPDATA, false);
              SetLength(S, StrLen(PChar(S)); // simple way: S:=PChar(S);
              AppDataPath := s + '\Test\';
              ShowMessage (AppDATAPath);
            end;
            Ответить
            • Обама дело говорит. Кстати, вот так делать нельзя:

              var
                s : array[ 0..MAX_PATH ] of Char;
                reg : TRegistry;
              begin
                s[ 0 ] := #0; // и нахуя?
                SHGetSpecialFolderPath (0, s, CSIDL_COMMON_APPDATA, false);
                AppDataPath := s + '\Test\'; // каст к PChar, опасно, нужен SetString
                ShowMessage (AppDATAPath);
              end;


              Вот ещё вдогонку, советы дебилов с того же программерса:

              http://www.programmersforum.ru/showthread.php?t=5857

              Особенно умилил пост:

              "а можно и еще проше
              Код:
              Pointer(sArray):= Pointer(sString);
              ShowMessage(pchar(sArray));

              "
              Ответить
              • Так-с...
                Ответить
                • Что спонадобилось барану в моём загоне топике?
                  Ответить
                  • А он ко мне.
                    Не переманивай моих поцев, своих надо иметь.
                    Ответить
                    • Блядь, юзера всея ГК - мои поцы, ибо единственным доктором здесь был я. А вот кто ты - я не ебу.
                      Кто ты?
                      Ответить
                    • Если бы я не был твоей файкой, я бы даже зачёт въебал за такую театральщину.
                      Ответить
                      • Не знаю к какой дискуссии присоединиться. Один обсуждает амплитуду циклоняши, другой - амплитуду хуёв.
                        Ответить
                        • Легко сложить колебания хуёв, но вот как их перемножить?
                          Ответить
                          • заценил я твой SIOCGARP, вроде пашет


                            #include <stdio.h>
                            #include <sys/socket.h>
                            #include <netinet/ip.h>
                            #include <arpa/inet.h>
                            #include <err.h>
                            #include <errno.h>
                            #include <unistd.h>
                            #include <linux/if_arp.h>
                            #include <sys/ioctl.h>
                            #include <string.h>
                            
                            static int  _show_err(const char* const err_t) {
                              int error = errno;
                              err(1, "%s", err_t);
                              return error;
                            }
                            
                            #define DEV "eth0"
                            #define MAC_ADDR_LEN 6
                            #define IP "192.168.1.1"
                            
                            int main() {
                              //сокет похуй какой, главное чтобы AF_INET
                              const int sockfd = socket(AF_INET, SOCK_STREAM, 0);
                              if (sockfd == -1) {
                                  return _show_err("socket");
                              }
                            
                              // Из инетовского адреса важен тока s_addr (у него бу брать мак)
                             // ну и AF надо установить
                              const struct sockaddr_in ip_addr = {
                                      .sin_family = AF_INET,
                                      .sin_addr.s_addr = inet_addr(IP)
                              };
                            
                            
                              struct arpreq request = { 0 };
                              // в arp_pa ложим "адрес протокола" -- в данном случае IP
                              memcpy(&request.arp_pa, &ip_addr, sizeof(ip_addr));
                              // в arp_dev ложим имя устройства, у меня нет udev rules такшта он eth0
                              memcpy(&request.arp_dev, DEV, strlen(DEV));
                            
                             //ioctl вернет -1 если записи нету
                              if (ioctl(sockfd, SIOCGARP, &request) != 0) {
                                      return _show_err("ioctl");
                              }
                            
                              //в arp_ha (это sockaddr) в поле sa_data (char[14]) будет лежать 6 байт
                              for(int i = 0; i < MAC_ADDR_LEN; i++) {
                                    // выводим их хексом, как обычно выводят мак        
                                    printf("%02X:", (unsigned char) request.arp_ha.sa_data[i]);
                              }
                              printf("\n");
                            
                            
                            
                              return 0;
                            }


                            говёненький API надо сказать
                            Ответить
                            • >>>"говёненький API надо сказать"

                              Не могу оценить.
                              Ты знаешь, что делать.
                              Ответить
                        • Присоединился к твоему анусу, кися.
                          Ответить
                  • У тебя хорошо получается.
                    Ответить
                    • Да это по-любому кто-то из чертей глумится, Борманд либо Люр.
                      Ответить
                • Представь себе, что мы имеем дело с сериализованными данными (см. функцию serialize). Например, для строки 'C:\Windows' сериализация в "PHP" будет выглядеть как 's:10:"C:\Windows";' (здесь "s" означает, что хранится строка, 10 означает длину).

                  Функция SHGetSpecialFolderPath не умеет возвращать длину строки (пусть в нашей фантастической PHPOS она возвращает строку 's::"C:\Windows";'). Нам нужно эту длину посчитать и подставить.

                  В решении, предложенном Бараком Хусейновичем, StrLen получает из этой строки длину (в данном примере 10), а SetLength вставляет это число в сериализацию.
                  Ответить
                  • [SHGetSpecialFolderPath is not supported. Instead, use ShGetFolderPath.]
                    SHGetFolderPathA Deprecated. Gets the path of a folder identified by a CSIDL value.

                    сепульки ебучие
                    Ответить
                  • [SHGetSpecialFolderPath is not supported. Instead, use ShGetFolderPath.]
                    SHGetFolderPathA Deprecated. Gets the path of a folder identified by a CSIDL value.

                    сепульки ебучие
                    Ответить
                    • Это что теперь, чтобы перевести на "PHP", придётся всю эту бесконечную цепочку переводить?
                      Ответить
                    • Note: As of Windows Vista, this function is merely a wrapper for SHGetKnownFolderPath. The CSIDL value is translated to its associated KNOWNFOLDERID and then SHGetKnownFolderPath is called. New applications should use the known folder system rather than the older CSIDL system, which is supported only for backward compatibility.
                      Ответить
                      • SHGetKnownFolderPath function

                        Retrieves the full path of a known folder identified by the folder's KNOWNFOLDERID.
                        Ответить
                        • Это только на Vista работает.
                          Майкрософт вообще славится своей совместимостью, так что, вызывать и юзать депрекатед-апи не так страшно, как может показаться.
                          Ответить
                          • >>Майкрософт вообще славится своей совместимостью
                            это да. У них в shimах (compatibility manager) там чуть-ли не игрухи есть
                            Ответить
                        • KNOWNFOLDERID
                          21 minutes to read
                          The KNOWNFOLDERID constants represent GUIDs that identify standard folders registered with the system as Known Folders.

                          FOLDERID_AccountPictures
                          GUID {008ca0b1-55b4-4c56-b8a8-4de4b299d3be}
                          Default Path %APPDATA%\Microsoft\Windows\AccountPictu res
                          https://docs.microsoft.com/en-us/windows/desktop/shell/knownfolderid

                          Святые негодники, да на кой хуй всё это надо?
                          На пустом совершенно месте раздули целый, блядь, фреймворк.

                          Пути ебанутые совершенно
                          %ALLUSERSPROFILE%\Microsoft\Windows\Start Menu\Programs\Administrative Tools


                          Вот это охуенно

                          FOLDERID_MusicLibrary
                          %APPDATA%\Microsoft\Windows\Libraries\Mu sic.library-ms


                          Кто этим пользуется? Кто, Блядь, этим вообще пользуется? У всех музыка лежит на d:\music, и слушают ее винампом.

                          Нахуй нужна папка "music library"?


                          Или вот например
                          FOLDERID_ProgramFiles
                          Угадайте, какой у нее путь?
                          А правильно: %ProgramFiles% (%SystemDrive%\Program Files)


                          Какой еблан будет хранить Program Files в папке, отличной от %ProgramFiles%?

                          Почему в позиксах все знают что в /bin/sh лежит борн ш?
                          Почему, блядь, там нету
                          FOLDERID_Bin с GUID {905e63b6-c1bf-494e-b29c-65b732d3d21a}?


                          А скажем вот
                          Independent software vendors (ISVs) can extend the set of Known Folder IDs with their own. They can define folders, give them IDs, and register them with the system. CSIDL values could not be extended.


                          Сука, я ISV, я могу FOLDERID_Pron зарегить?
                          Я уже и свой guidgen.exe достал
                          Ответить
                          • > Пути ебанутые совершенно

                            Да. И я уже где-то писа́л, что ограничение на длину переменной PATH в «Windows 10» такое же, как в «Windows 2000». За 18 лет ничего не изменилось. На «Windows» упала стабильность.

                            > Какой еблан будет хранить Program Files в папке, отличной от %ProgramFiles%?

                            С этим согласен. Другое дело, что иногда приходится устанавливать программу не в Program Files либо чтобы уложиться в ограничение на длину PATH, либо потому что позиксовая хрень не любит пробелы в директориях.

                            > Почему в позиксах все знают что в /bin/sh лежит борн ш?

                            Потому что винда — это винда, а позикс — это позикс. Кстати, в винде был свой позикс, только он оказался не нужен.

                            А вообще да, не хватает какой-нибудь стандартной директории, перечисленной в PATH (кроме System32), в которую можно кидать исполнимые файлы.

                            > FOLDERID_MusicLibrary

                            А это чтобы "Windows" случайно расшаривали по локалке папку с музыкой и все слушали и текли.
                            Ответить
                            • У меня прыщеговно стоит в папке \priwegovno
                              Ответить
                              • А папка юзера C:\Users\priweblyad?
                                Ответить
                                • Папка юзера нормальная, я не прыщеблядь.
                                  Ответить
                                  • c:\Documents And Settings\Syoma?
                                    Ответить
                                    • Разумеется! \Users появилась в "Vista", а все "Windows" новее, чем "XP", не нужны.
                                      Ответить
    • показать все, что скрыто>>When SHGetSpecialFolderPath is called, writes to the string
      facepalm
      Ответить
      • My double *facepalm* raised by you. But it's not your fault - it's Vladimir Vladimirovitch's fault.
        Ответить
    • Знаешь, иди нахуй. Я не хочу дальше читать. Это все звучит, как "я научился выживать в среде линукс, я молодец, а вы все гавно", но ты умалчиваешь о том, зачем ты забирался на эту гору. Умный в гору не пойдёт, умный гору обойдет, слышал такую поговорку? Пользователю важна простота и стабильность, никому не хочется ебаться с каждой проблемой под иксами просто так.
      Ответить

    Добавить комментарий