Указатель на область памяти

Программирование на Visual Basic, главный форум. Обсуждение тем программирования на VB 1—6.
Даже если вы плохо разбираетесь в VB и программировании вообще — тут вам помогут. В разумных пределах, конечно.
Правила форума
Темы, в которых будет сначала написано «что нужно сделать», а затем просьба «помогите», будут закрыты.
Читайте требования к создаваемым темам.
GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 12.10.2004 (Вт) 10:46

Довольно сложно вести подобный диалог :roll:

Я рассуждаю с позиции человека, работающего со всеми упоминаемыми языками. Я привожу те аргументы, которые считаю правильными. Я перечитал свои аргументы ещё раз и не нашёл ничего, что могло бы вызвать у недогматичного собеседника подобную реакцию.

Для тех кто знает что такое виртуальная машина, объяснять что такое псевдокод(P-code) не нужно. А вобще то это такой хитрожопый способ ...

Ну причём, причём здесь P-code???
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 12.10.2004 (Вт) 10:57

BP, ты наверное и не заметил, что в VB5 появилась возможность компиляции в Native Code?
С тех пор "виртуальная машина" в VB есть только в виде двух букв "VM" в названии рантаймовой библиотеки. Кроме названия, её нигде больше нет.
Изображение

marvan
Бывалый
Бывалый
 
Сообщения: 269
Зарегистрирован: 22.06.2004 (Вт) 13:26
Откуда: Москва

Сообщение marvan » 12.10.2004 (Вт) 11:27

GSerg писал(а):
BP писал(а):Способ выполнения приложения
VB - вызовы модулей зашитых в виртуальную машину
PB - Непосредственное выполнение последовательно расположенных операций

Потрудись ка-нибудь дизассемблировать экзешник, созданный VB. Посмотри, как реализованы вызовы процедур. И подобных утверждений больше не делай.

Совершенно не понял причину наезда. Не знаю как это правильно называется:
CALL DWORD PTR DS:[<&MSVBVM60.vbaStrMove>]
но по любому, это медленнее, чем "Непосредственное выполнение последовательно расположенных операций"
GSerg писал(а):С помощью CreateSAFEARRAY можно обратиться к любому участку памяти так, словно он содержит данные типа N. При этом соблюдается полный синтаксис VB, никаких копирований.

Вопрос: как создать байтовый массив, имея адрес и размер участка памяти? Пожалуйста с примером - очень надо.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 12.10.2004 (Вт) 12:19

Код: Выделить всё
dim b() as byte

CreateSAFEARRAY ArrPtr(b), 1, PointerToData, 1, SizeOfData
'использование массива...
DestroySAFEARRAY ArrPtr(b)


http://www.vbstreets.ru/VB/Articles/65977.aspx
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

FaKk2
El rebelde gur&#250;
El rebelde gur&#250;
Аватара пользователя
 
Сообщения: 2031
Зарегистрирован: 09.03.2003 (Вс) 22:10
Откуда: Los Angeles

Сообщение FaKk2 » 12.10.2004 (Вт) 16:44

GSerg писал(а):
Код: Выделить всё
dim b() as byte

CreateSAFEARRAY ArrPtr(b), 1, PointerToData, 1, SizeOfData
'использование массива...
DestroySAFEARRAY ArrPtr(b)


http://www.vbstreets.ru/VB/Articles/65977.aspx
Браво маэстро!

Вообще здравый смысл предлагает показать зачатки интеллекта и прекратить спор 8)
Для получения ответа надо продемонстрировать качества, позволяющие стать компетентным — внимательность, вдумчивость, наблюдательность, желание активно участвовать в выработке решения.

alibek
Большой Человек
Большой Человек
 
Сообщения: 14205
Зарегистрирован: 19.04.2002 (Пт) 11:40
Откуда: Russia

Сообщение alibek » 12.10.2004 (Вт) 16:50

"Никогда не спорьте с дураком -- люди могут не заметить между вами разницы" :)
Lasciate ogni speranza, voi ch'entrate.

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 12.10.2004 (Вт) 17:37

Нет, вот только теперь - браво, маэстро :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

marvan
Бывалый
Бывалый
 
Сообщения: 269
Зарегистрирован: 22.06.2004 (Вт) 13:26
Откуда: Москва

Сообщение marvan » 13.10.2004 (Ср) 12:07

2 GSerg
Спасибо, разобрался, заработало. Правда в коментарии к статье сказано, "что работать используя структуру (тип) SAFEARRAY несомненно проще" - вот и вопрос: можно ли тоже самое сделать используя структуру (тип) SAFEARRAY?

GSerg
Шаман
Шаман
 
Сообщения: 14286
Зарегистрирован: 14.12.2002 (Сб) 5:25
Откуда: Магадан

Сообщение GSerg » 13.10.2004 (Ср) 12:52

Мне не всё нравится в комментарии :)
Например, там сказано, что я ошибся с уровнем косвенности, а это не так, у меня всё правильно.
А работать через структуру SAFEARRAY - так я через неё и работаю, только это уже облачено в функции :) Функции используют структуру SAFEARRAY, ты используешь функции, все довольны :)
Как только вы переберёте все варианты решения и не найдёте нужного, тут же обнаружится решение, простое и очевидное для всех, кроме вас

Aleksej
Продвинутый пользователь
Продвинутый пользователь
Аватара пользователя
 
Сообщения: 191
Зарегистрирован: 03.06.2003 (Вт) 9:58

Сообщение Aleksej » 19.10.2004 (Вт) 8:13

Вот кусочек кода для решения этой проблемы: :D
Код: Выделить всё
PBYTE _stdcall MapPhysToLin(PBYTE pbPhysAddr, DWORD dwPhysSize, HANDLE *pPhysicalMemoryHandle)
{
  PBYTE pbLinAddr;
  tagPhys32Struct Phys32Struct;
  DWORD dwBytesReturned;

  if (!IsWinIoInitialized)
    return false;

  if (IsNT)
  {
    Phys32Struct.dwPhysMemSizeInBytes = dwPhysSize;
    Phys32Struct.pvPhysAddress = pbPhysAddr;

    if (!DeviceIoControl(hDriver, IOCTL_WINIO_MAPPHYSTOLIN, &Phys32Struct,
                         sizeof(tagPhys32Struct), &Phys32Struct, sizeof(tagPhys32Struct),
                         &dwBytesReturned, NULL))
      return NULL;
    else
    {
      pbLinAddr = (PBYTE)((DWORD)Phys32Struct.pvPhysMemLin + (DWORD)pbPhysAddr - (DWORD)Phys32Struct.pvPhysAddress);
      *pPhysicalMemoryHandle = Phys32Struct.PhysicalMemoryHandle;
    }
  }
  else
  {
    _asm
    {
      Mov BX, WORD PTR [pbPhysAddr + 2]
      Mov CX, WORD PTR [pbPhysAddr]
      Mov SI, WORD PTR [dwPhysSize + 2]
      Mov DI, WORD PTR [dwPhysSize]
    }


    DPMICall(0x800, (DWORD)pbPhysAddr);   

    _asm
    {
      Jnc Success
      Xor BX, BX
      Xor CX, CX

    Success:

      Mov WORD PTR [pbLinAddr + 2], BX
      Mov WORD PTR [pbLinAddr], CX
    }
  }

  return pbLinAddr;
}

tyomitch
Пользователь #1352
Пользователь #1352
Аватара пользователя
 
Сообщения: 12822
Зарегистрирован: 20.10.2002 (Вс) 17:02
Откуда: חיפה

Сообщение tyomitch » 19.10.2004 (Вт) 17:45

А hDriver в этом коде откуда берётся?

Без специального драйвера афаик это никак не выяснить - да и не надо никому, самое главное.
Изображение

Пред.

Вернуться в Visual Basic 1–6

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 42

    TopList  
cron