На главную Наши проекты:
Журнал   ·   Discuz!ML   ·   Wiki   ·   DRKB   ·   Помощь проекту
ПРАВИЛА FAQ Помощь Участники Календарь Избранное RSS
msm.ru
! user posted image
Пожалуйста, выделяйте текст программы тегом [сode=pas] ... [/сode]. Для этого используйте кнопку [code=pas] в форме ответа или комбобокс, если нужно вставить код на языке, отличном от Дельфи/Паскаля.

Соблюдайте общие правила форума

Следующие вопросы задаются очень часто, подробно разобраны в FAQ и, поэтому, будут безжалостно удаляться:
1. Преобразовать переменную типа String в тип PChar (PAnsiChar)
2. Как "свернуть" программу в трей.
3. Как "скрыться" от Ctrl + Alt + Del (заблокировать их и т.п.)
4. Как запустить программу/файл? (и дождаться ее завершения)
5. Как перехватить API-функции, поставить hook? (перехват сообщений от мыши, клавиатуры - внедрение в удаленное адресное прстранство)
... (продолжение следует) ...

Внимание:
Попытки открытия обсуждений реализации вредоносного ПО, включая различные интерпретации спам-ботов, наказывается предупреждением на 30 дней.
Повторная попытка - 60 дней. Последующие попытки - бан.
Мат в разделе - бан на три месяца...

Полезные ссылки:
user posted image MSDN Library user posted image FAQ раздела user posted image Поиск по разделу user posted image Как правильно задавать вопросы


Выразить свое отношение к модераторам раздела можно здесь: user posted image Rouse_, user posted image Krid

Модераторы: Rouse_, Krid
  
> copyMemory , баг?
    шото ваще нипойму
    после этой операции
    ExpandedWrap disabled
      copyMemory(@cmd[5], @buf[0], ALength);

    обнуляется исходный буфер

    почему?

    Добавлено
    ExpandedWrap disabled
      cmd, @buf: array ob byte
      А что у тебя является исходным ?
      PS: На вский случай - СopyMemory(@cmd[5], @buf[0], ALength) в (не)лучших традициях Си копирует buf[0] в cmd[5], а не наоборот
        Цитата leo @
        А что у тебя является исходным ?
        PS: На вский случай - СopyMemory(@cmd[5], @buf[0], ALength) в (не)лучших традициях Си копирует buf[0] в cmd[5], а не наоборот

        в этой ветке если не ошибаюсь говорят про винАпи.
        а вин апи говорит следующее
        Цитата
        The CopyMemory function copies a block of memory from one location to another.

        VOID CopyMemory (

        PVOID Destination, // address of copy destination
        CONST VOID *Source, // address of block to copy
        DWORD Length // size, in bytes, of block to copy
        );


        Parameters

        Destination

        Points to the starting address of the copied block's destination.

        Source

        Points to the starting address of the block of memory to copy.

        Length

        Specifies the size, in bytes, of the block of memory to copy.



        Return Values

        This function has no return value.

        Remarks

        If the source and destination blocks overlap, the results are undefined. For overlapped blocks, use the MoveMemory function.


        Добавлено
        проверил
        такая же бага проявляется при ипользовании сего:
        ExpandedWrap disabled
          procedure TSmartCard.copyBuf(const src: array of byte; var dst: array of byte; s_count: word; s_from: word = 0; d_start: word = 0);
          var
            i: word;
          begin
            for i := 0 + s_from to s_count do
              dst[i + d_start] := src[i];
          end;


        решается только заменой
        ExpandedWrap disabled
          array of byte
        на
        ExpandedWrap disabled
          array[0..X] of byte


        и всё же непойму...

        кто-нить может дать толковый ответ?
          Цитата subdigger @
          кто-нить может дать толковый ответ?


          Желательно задать толковый вопрос для начала.

          Покажи, как определены cmd и buf, в какой секции модуля.
            Цитата subdigger @
            в этой ветке если не ошибаюсь говорят про винАпи.
            а вин апи говорит следующее

            Во-первых, я сказал то же самое, т.е. первый параметр - "куда копируем", второй - "откуда".
            Во-вторых, причем тут апи, если есть старая добрая дельфийская Move ;)
            В-третьих, не забываем выделять память под дин.массив через SetLength
            ExpandedWrap disabled
              procedure TForm1.Button1Click(Sender:TObject);
              var
                source,dest:array of byte;
                s:string;
                Alength:integer;
              begin
                s:='Hello, world!';
                ALength:=Length(s)+1;
                SetLength(source,ALength);    //!!! не забываем выделить память
                Move(s[1],source[0],ALength); //копируем через Move
                SetLength(dest,ALength);
                CopyMemory(@dest[0],@source[0],ALength); //копируем через CopyMemory
                ShowMessage('source = '+pChar(source)+#13#10+
                            'dest = '+pChar(dest));
              end;
              Цитата Демо

              Желательно задать толковый вопрос для начала.

              ExpandedWrap disabled
                type
                TCmd = array[0..260] of byte;
                ....
                procedure TMyClass.WriteFile(buf: array of byte; cnt: word);
                var
                  cmd: TCmd;
                  AStart, ALength, t, d : word;
                begin
                  ZeroMemory(@cmd, 256);
                  ALength := cnt;
                  copyMemory(@cmd[5], @buf[0], ALength);
                  {
                    тут:
                    cmd - с 5-го символа - данные из buf
                    buf - () или nil - тоесть дальнейшее оперирование с ним приводит к аксесс виолатион
                    Alength - 0 - опять таки непойму каким образом
                  }
                end;

              использование вместо copyMemory своей процедуры:
              ExpandedWrap disabled
                procedure TSmartCard.copyBuf(const src: array of byte; var dst: array of byte; s_count: word; s_from: word = 0; d_start: word = 0);
                var
                  i: word;
                begin
                  for i := 0 + s_from to s_count do
                    dst[i + d_start] := src[i];
                end;

              приводит к такому же результату

              Цитата leo
              Во-вторых, причем тут апи, если есть старая добрая дельфийская Move

              не занаю как у вас а у мну
              ExpandedWrap disabled
                unit Windows;
                ......
                procedure MoveMemory(Destination: Pointer; Source: Pointer; Length: DWORD);
                begin
                  Move(Source^, Destination^, Length);
                end;
                 
                procedure CopyMemory(Destination: Pointer; Source: Pointer; Length: DWORD);
                begin
                  Move(Source^, Destination^, Length);
                end;

              посему шо мув шо копи - это грубо говоря одно и то же. хотя на счёт апей таки наверно я ошибся

              Цитата leo
              В-третьих, не забываем выделять память под дин.массив через SetLength

              исходник заведомо непустой (считай, что выделил) а приёмник заведомо статической длины
              0 пользователей читают эту тему (0 гостей и 0 скрытых пользователей)
              0 пользователей:


              Рейтинг@Mail.ru
              [ Script execution time: 0,0791 ]   [ 16 queries used ]   [ Generated: 18.08.25, 01:30 GMT ]