Интерфейс Ruby win32 api

Я рекомендовал бы использовать PDO (Объекты данных PHP) для выполнения параметризованных SQL-запросов.

Не только делает это защищает от Внедрения SQL, но и оно также ускоряет запросы.

И при помощи PDO, а не mysql_, mysqli_, и pgsql_ функции, Вы подаете свою заявку, немного более абстрактную от базы данных в редком возникновении, что необходимо переключить поставщиков БД.

6
задан 29 July 2009 в 18:45
поделиться

3 ответа

Думаю, вам придется изучить метод String # pack , чтобы правильно заполнить структуру APPBARDATA .

См. «Кирка» раздел книги на Win32 и Ruby (прокрутите вниз до определения класса Win32API).

Как уже было замечено, вы будете использовать аргумент «P» и передадите правильно упакованный String (или String s) в функцию.

В качестве альтернативы, если у вас есть немного времени на изучение, вы можете посмотреть библиотеку FFI, которая, кажется, делает все более дружественным способом. У меня нет прямого опыта, но попробуйте взглянуть на

0
ответ дан 17 December 2019 в 07:07
поделиться

SHAppBarMessage принимает два параметра: DWORD и указатель на APPBARDATA,
так что это должно быть объявлено так:

app_bar_msg = Win32API.new('shell32', 'SHAppBarMessage', ['L', 'P'], 'L')

затем вызвано:

msg_id = 1
app_bar_data = "properly initalized binary string" #should have sizeof(APPBARDATA) bytes
app_bar_msg.call(msg_id, app_bar_data)

Но я не знаю Ruby, так что, возможно, я ошибаюсь ...

0
ответ дан 17 December 2019 в 07:07
поделиться

Хитрость заключается в использовании «P» в качестве спецификатора формата для всех аргументов указателя . Вам придется предоставить строку как указанную область.

Конечно, вам придется убедиться, что эти строки имеют правильный размер ожидаемого размера, в противном случае произойдет плохие вещи.

Вы можете напрямую создать эти строки

# Mostly useful when the area will be totally overwritten
pointed_to_area = "\0" * n

или использовать более цивилизованную Array # Pack

# Allows you to control how ruby values get encoded in the buffer
pointed_to_area = [1, 2, 3, 4].pack('SsLI')

Надеюсь, это поможет.


Следующие работы на моем коробке XP со старым Ruby 1.8.2:
require 'Win32API'


module Win32
  # This method is only here for test purposes
  # Be careful to use the ascii version
  FindWindow = Win32API.new('user32', 'FindWindowA', ['P', 'P'], 'L')
  def self.findWindow(lpClassName, lpWindowName)
    h = FindWindow.call(lpClassName, lpWindowName)
    raise "FindWindow failed" if h == 0
    h
  end

  # From winddef.h
  RECT = Struct.new(:left, :top, :right, :bottom)
  RECT.class_eval do
    def pack
      [left, top, right, bottom].pack('l4')
    end
    def self.unpack(s)
      new(*s.unpack('l4'))
    end
  end

  # From shellapi.h
  APPBARDATA = Struct.new(:cbSize, :hWnd, :uCallbackMessage, :uEdge, :rc, :lParam)
  APPBARDATA.class_eval do
    def pack
      unless rc.is_a? RECT
        raise ArgumentError, ":rc must be an instance of Win32::RECT, got #{rc.inspect}"
      end
      # DWORD + HWND + UINT + UINT + RECT + LPARAM
      cbSize = 4 + 4 + 4 + 4 + 16 + 4
      [cbSize, hWnd, uCallbackMessage, uEdge, rc.pack, lParam].pack('L2I2a16L')
    end
    def self.unpack(s)
      tmp = self.new(*s.unpack('L2I2a16L'))
      tmp.rc = RECT.unpack(tmp.rc)
      tmp
    end
  end
  SHAppBarMessage = Win32API.new('shell32', 'SHAppBarMessage', ['L', 'P'], 'L')

  # Calls SHAppBarMessage and returns the altered APPBARDATA
  def self.shAppBarMessage(dwMessage, appBarData)
    s = appBarData.pack
    ok = (SHAppBarMessage.call(dwMessage, s) != 0)
    raise "SHAppBarMessage failed" unless ok
    APPBARDATA.unpack(s)
  end

  ABM_NEW              = 0x00000000
  ABM_REMOVE           = 0x00000001
  ABM_QUERYPOS         = 0x00000002
  ABM_SETPOS           = 0x00000003
  ABM_GETSTATE         = 0x00000004
  ABM_GETTASKBARPOS    = 0x00000005
  ABM_ACTIVATE         = 0x00000006
  ABM_GETAUTOHIDEBAR   = 0x00000007
  ABM_SETAUTOHIDEBAR   = 0x00000008
  ABM_WINDOWPOSCHANGED = 0x00000009
  ABM_SETSTATE         = 0x0000000a

  ABE_LEFT   = 0
  ABE_TOP    = 1
  ABE_RIGHT  = 2
  ABE_BOTTOM = 3
end




if __FILE__ == $0
  require 'test/unit'
  class SHAppBarMessageTest < Test::Unit::TestCase
    include Win32

    def test_pack_unpack
      a = APPBARDATA.new(-1, 0, 0, ABE_TOP, RECT.new(1, 2, 3, 4), 0)
      b = APPBARDATA.unpack(a.pack)
      a.cbSize = b.cbSize
      assert_equal(a.values, b.values)
    end
    def test_simple_pos_query
      h = Win32.findWindow("Shell_TrayWnd", nil)
      a = APPBARDATA.new(-1, 0, 0, ABE_TOP, RECT.new(0, 0, 0, 0), 0)
      result = Win32.shAppBarMessage(ABM_GETTASKBARPOS, a)
      assert(result.rc.left < result.rc.right)
      assert(result.rc.top < result.rc.bottom)
      puts result.rc.inspect
    end
  end
end
4
ответ дан 17 December 2019 в 07:07
поделиться
Другие вопросы по тегам:

Похожие вопросы: