Школоло / Говнокод #24872 Ссылка на оригинал

0

  1. 1
  2. 2
  3. 3
  4. 4
  5. 5
  6. 6
  7. 7
  8. 8
  9. 9
  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 BagorCtretora, (Updated )

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

  • "Ахуенно крутой спец по строкам."

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

      Что за дебильное слово? Почему не "контактация" (логично - контакт двух строк)?
      Ответить
      • В "PHP" нет конкатенации, и потому я за "PHP"
        Ответить
        • Хочу, чтобы "roman-kashitsyn" тоже писал "Переведи на "PHP"" или "Поэтому я за "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.
      Ответить
        • 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.

                  сепульки ебучие
                  Ответить
                  • Это что теперь, чтобы перевести на "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\AccountPictures
                        https://docs.microsoft.com/en-us/windows/desktop/shell/knownfolderid

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

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


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

                        FOLDERID_MusicLibrary
                        %APPDATA%\Microsoft\Windows\Libraries\Music.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
                            Ответить
                              • Папка юзера нормальная, я не прыщеблядь.
                                Ответить
                                  • Разумеется! \Users появилась в "Vista", а все "Windows" новее, чем "XP", не нужны.
                                    Ответить
      • То есть, длина буфера больше помещенной в него строки и pchar спотыкается о нулевой символ?
        Ответить
  • >>When SHGetSpecialFolderPath is called, writes to the string
    facepalm
    Ответить
  • Знаешь, иди нахуй. Я не хочу дальше читать. Это все звучит, как "я научился выживать в среде линукс, я молодец, а вы все гавно", но ты умалчиваешь о том, зачем ты забирался на эту гору. Умный в гору не пойдёт, умный гору обойдет, слышал такую поговорку? Пользователю важна простота и стабильность, никому не хочется ебаться с каждой проблемой под иксами просто так.
    Ответить

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

Семь раз отмерь — один отрежь, guest!

    А не использовать ли нам bbcode?


    8