вторник, 26 июля 2016 г.

выскакивает CPU Window на ntdll.DbgBreakPoint? Как от этого избавиться - Решение

С какого-то момента в старом Билдере старой полуживой Вин2003 при работе над старыми проектами при запуске проекта из IDE он стал постоянно вываливаться в дебаггер по Ret 3, причем корни уходили в ntdll и к самому проекту не имели никакого отношения (в том плане, что аналога DebugBreak() у меня нигде не было). Решение проблемы: делаем модуль и закидываем его в проект и получаем возможность дальше нормально отлаживать проект :) Спасибо решению здесь :)
unit patchret3;

interface

implementation

uses Windows, SysUtils;

procedure PatchINT3;
var
    NOP : Byte;
    BytesWritten : DWORD;
    NtDll : THandle;
    P : Pointer;
begin
    if Win32Platform <> VER_PLATFORM_WIN32_NT then Exit;
    NtDll := GetModuleHandle('NTDLL.DLL');
    if NtDll = 0 then Exit;
    P := GetProcAddress(NtDll, 'DbgBreakPoint');
    if P = nil then Exit;

    try
      if Char(P^) <> #$CC then Exit;
      NOP := $90;
      if WriteProcessMemory(GetCurrentProcess, P, @NOP, 1,
        BytesWritten) and (BytesWritten = 1) then
        FlushInstructionCache(GetCurrentProcess, P, 1);
    except
      //Do not panic if you see an EAccessViolation here,
      // it is perfectly harmless!
    on EAccessViolation do ;
    else raise;
  end;
end;

initialization
    PatchINT3;
 
end.

вторник, 8 апреля 2014 г.

WP E-Commerce, как получить данные корзины

Один из вариантов вот такой:

echo "<pre>". print_r($GLOBALS['wpsc_cart'], true)."</pre>";
echo "<pre>". print_r($GLOBALS['wpsc_cart']->cart_items[0], true)."</pre>";
и вывести это может вот такую структуру [для 3.8]
wpsc_cart_item Object
(
    [cart] => wpsc_cart Object
        (
            [delivery_country] => 
            [selected_country] => 
            [delivery_region] => 
            [selected_region] => 
            [selected_shipping_method] => 
            [selected_shipping_option] => 
            [selected_shipping_amount] => 
            [coupon] => 
            [tax_percentage] => 0
            [unique_id] => ef7966fac1c235bd85598e81259625854936d3a8
            [errors] => Array
                (
                )

            [total_tax] => 0
            [base_shipping] => 
            [total_item_shipping] => 
            [total_shipping] => 
            [subtotal] => 80
            [total_price] => 80
            [uses_shipping] => 
            [is_incomplete] => 1
            [cart_items] => Array
                (
                    [0] => wpsc_cart_item Object
 *RECURSION*
                    [1] => wpsc_cart_item Object
                        (
                            [cart] => wpsc_cart Object
 *RECURSION*
                            [product_id] => 466
                            [variation_values] => 
                            [product_variations] => 
                            [variation_data] => 
                            [quantity] => 1
                            [provided_price] => 
                            [product_name] => Какое-то название
                            [category_list] => Array
                                (
                                    [0] => product-category
                                )

                            [category_id_list] => Array
                                (
                                    [0] => 38
                                )

                            [unit_price] => 50
                            [total_price] => 50
                            [taxable_price] => 0
                            [tax] => 0
                            [weight] => 0
                            [shipping] => 0
                            [sku] => 
                            [product_url] => http://какой-то урл/
                            [image_id] => 
                            [thumbnail_image] => WP_Post Object
                                (
                                    [ID] => 467
                                    [post_author] => 1
                                    [post_date] => 2012-07-15 00:35:20
                                    [post_date_gmt] => 2012-07-14 21:35:20
                                    [post_content] => 
                                    [post_title] => ACER
                                    [post_excerpt] => 
                                    [post_status] => inherit
                                    [comment_status] => open
                                    [ping_status] => open
                                    [post_password] => 
                                    [post_name] => acer-2
                                    [to_ping] => 
                                    [pinged] => 
                                    [post_modified] => 2012-07-15 00:35:20
                                    [post_modified_gmt] => 2012-07-14 21:35:20
                                    [post_content_filtered] => 
                                    [post_parent] => 466
                                    [guid] => http://.../uploads/2012/07/....jpg
                                    [menu_order] => 0
                                    [post_type] => attachment
                                    [post_mime_type] => image/jpeg
                                    [comment_count] => 0
                                    [filter] => raw
                                    [post_category] => 0
                                    [member_access_visibility] => default
                                )

                            [custom_tax_rate] => 
                            [meta] => Array
                                (
                                    [0] => Array
                                        (
                                            [wpec_taxes_taxable_amount] => 
                                            [external_link] => 
                                            [external_link_text] => 
                                            [external_link_target] => 
                                            [weight] => 0
                                            [weight_unit] => pound
                                            [dimensions] => Array
                                                (
                                                    [height] => 0
                                                    [height_unit] => in
                                                    [width] => 0   
                                                    [width_unit] => in
                                                    [length] => 0
                                                    [length_unit] => in
                                                )

                                            [shipping] => Array
                                                (
                                                    [local] => 0
                                                    [international] => 0
                                                )

                                            [merchant_notes] => 
                                            [engraved] => 0
                                            [can_have_uploaded_image] => 0
                                            [enable_comments] => 
                                            [unpublish_when_none_left] => 0
                                            [no_shipping] => 0
                                            [quantity_limited] => 0
                                            [special] => 0
                                            [display_weight_as] => pound
                                            [table_rate_price] => Array
                                                (
                                                    [quantity] => Array
                                                        (
                                                        )

                                                    [table_price] => Array
                                                        (
                                                        )

                                                )

                                            [google_prohibited] => 0
                                        )

                                )

                            [item_meta:wpsc_cart_item:private] => Array
                                (
                                )

                            [is_donation] => 0
                            [apply_tax] => 1
                            [priceandstock_id] => 0
                            [custom_message] => 
                            [custom_file] => 
                            [comment] => 
                            [time_requested] => 
                            [file_data] => 
                            [is_customisable] => 
                            [stock] => 
                            [uses_shipping] => 1
                            [has_limited_stock] => 
                            [file_id] => 
                            [is_downloadable] => 
                        )

                )

            [cart_item] => wpsc_cart_item Object
 *RECURSION*
            [cart_item_count] => 2
            [current_cart_item] => -1
            [in_the_loop] => 
            [shipping_methods] => 
            [shipping_method] => 
            [shipping_method_count] => 1
            [current_shipping_method] => -1
            [in_the_method_loop] => 
            [shipping_quotes] => 
            [shipping_quote] => 
            [shipping_quote_count] => 0
            [current_shipping_quote] => -1
            [in_the_quote_loop] => 
            [coupons_name] => 
            [coupons_amount] => 0
            [shipping_option] => 
        )

    [product_id] => 468
    [variation_values] => 
    [product_variations] => 
    [variation_data] => 
    [quantity] => 3
    [provided_price] => 
    [product_name] => Еще одно название
    [category_list] => Array
        (
            [0] => product-category
        )

    [category_id_list] => Array
        (
            [0] => 38
        )

    [unit_price] => 10
    [total_price] => 30
    [taxable_price] => 0
    [tax] => 0
    [weight] => 0
    [shipping] => 0
    [sku] => 
    [product_url] => http://.../products-page/product-category/.../
    [image_id] => 
    [thumbnail_image] => WP_Post Object
        (
            [ID] => 469
            [post_author] => 1
            [post_date] => 2012-07-15 00:38:31
            [post_date_gmt] => 2012-07-14 21:38:31
            [post_content] => 
            [post_title] => title
            [post_excerpt] => 
            [post_status] => inherit
            [comment_status] => open
            [ping_status] => open
            [post_password] => 
            [post_name] => title-2
            [to_ping] => 
            [pinged] => 
            [post_modified] => 2012-07-15 00:38:31
            [post_modified_gmt] => 2012-07-14 21:38:31
            [post_content_filtered] => 
            [post_parent] => 468
            [guid] => http://.../wp-content/uploads/2012/07/....jpg
            [menu_order] => 0
            [post_type] => attachment
            [post_mime_type] => image/jpeg
            [comment_count] => 0
            [filter] => raw
            [post_category] => 0
            [member_access_visibility] => default
        )

    [custom_tax_rate] => 
    [meta] => Array
        (
            [0] => Array
                (
                    [wpec_taxes_taxable_amount] => 
                    [external_link] => 
                    [external_link_text] => 
                    [external_link_target] => 
                    [weight] => 0
                    [weight_unit] => pound
                    [dimensions] => Array
                        (
                            [height] => 0
                            [height_unit] => in
                            [width] => 0   
                            [width_unit] => in
                            [length] => 0
                            [length_unit] => in
                        )

                    [shipping] => Array
                        (
                            [local] => 0
                            [international] => 0
                        )

                    [merchant_notes] => 
                    [engraved] => 0
                    [can_have_uploaded_image] => 0
                    [enable_comments] => 
                    [unpublish_when_none_left] => 0
                    [no_shipping] => 0
                    [quantity_limited] => 0
                    [special] => 0
                    [display_weight_as] => pound
                    [table_rate_price] => Array
                        (
                            [quantity] => Array
                                (
                                )

                            [table_price] => Array
                                (
                                )

                        )

                    [google_prohibited] => 0
                )

        )

    [item_meta:wpsc_cart_item:private] => Array
        (
        )

    [is_donation] => 0
    [apply_tax] => 1
    [priceandstock_id] => 0
    [custom_message] => 
    [custom_file] => 
    [comment] => 
    [time_requested] => 
    [file_data] => 
    [is_customisable] => 
    [stock] => 
    [uses_shipping] => 1
    [has_limited_stock] => 
    [file_id] => 
    [is_downloadable] => 
)

понедельник, 16 декабря 2013 г.

Qt. Как отследить перемещение мыши без нажатой кнопки

Qt. Как отследить перемещение мыши без нажатой кнопки?

Как отследить перемещения мыши на каком-бы то ни было виджете? Тут есть несколько вариантов:
  1. отслеживать событие.
  2. поставить фильтр.
  3. сделать захват мыши.
Сразу оговорюсь, пока вариант 3 мы рассматривать не будем (да и использовать его официальная документация не рекомендует).
Допустим, что отслеживать будем событие на форме.

Вариант 1.

Нам надо переопределить метод void mouseMoveEvent(QMouseEvent *). Поэтому просто в реализацию формы прописываем данный метод:

void MainWindow::mouseMoveEvent(QMouseEvent *me)
{
  qDebug() << tr("mouseEvent emitted: [x, y] = [%1, %2]"). 
              arg(me->x()).arg(me->y());
}

Но тут есть одно НО! Дело в том, что по умолчанию данное событие 
возникает только в случае нажатия одной из клавиш мыши. Чтобы можно 
было отследить движение мыши в "свободном полете", нам необходимо 
установить ее отслеживание с помощью метода 
 
void setMouseTracking(bool)
 
поэтому в конструкторе добавляем его:
 
this->setMouseTracking(true);
 
и такой же метод для виджета centralWidget() 
centralWidget()->setMouseTracking(true);
 
Получаем вот такой код:
 
#include "mainwindow.h"
#include "qmessagebox"
#include "ui_mainwindow.h"


MainWindow::MainWindow(QWidget *parent) :
  QMainWindow(parent),
  ui(new Ui::MainWindow)
{
  ui->setupUi(this);

  this->setMouseTracking(true);
  centralWidget()->setMouseTracking(true);
}

MainWindow::~MainWindow()
{
  delete ui;
}

void MainWindow::mouseMoveEvent(QMouseEvent *me)
{
  qDebug() << tr("mouseEvent emitted: [x, y] = [%1, %2]")
               .arg(me->x()).arg(me->y());
}



Вариант 2:

а можно установить фильтр и тогда мы в одной функции сможем отслеживать сразу несколько событий. Делается это так:


#include "mainwindow.h"
#include "ui_mainwindow.h"

MainWindow::MainWindow(QWidget *parent) :
  QMainWindow(parent),
  ui(new Ui::MainWindow)
{
  ui->setupUi(this);




  this->setMouseTracking(true);
  centralWidget()->setMouseTracking(true);

 
 this->installEventFilter(this);
}
 

bool MainWindow::eventFilter(QObject* obj, QEvent* event)
{
  if (event->type() == QEvent::MouseMove)
    {
      QMouseEvent* me = static_cast<QMouseEvent*>(event);
      if (me)
        qDebug() << tr("mouseEvent emitted: [x, y] = [%1, %2]")
                       .arg(me->x()).arg(me->y());
      else
        qDebug() << tr("Стремное событие: %1");
    }
  return QMainWindow::eventFilter(obj, event);
}
 


В обоих случаях есть второе НО! событие не будет обрабатываться, 
если курсор мыши находится над дочерним элементом. Поэтому если необходимо 
"сквозное" отслеживание, то данный фильтр надо ставить для каждого 
дочернего элемента.

Qt. предотвращение закрытия окна программы

Qt. предотвращение закрытия окна программы

Примечание: речь идет о Qt на виджетах.

Даже если у вас приложение состоит из одной формы, то в любом случае его можно закрыть кнопкой в заголовке или нажатием быстрых клавиш. Чтобы это предотвратить, надо всего навсего переопределить стандартное событие виджета closeEvent. Оно имеет следующее определение:

virtual void closeEvent(QCloseEvent *event);

таким образом, если мы имеем, например, форму MainWindow, то в заголовке (.h) пишем такой код:

class MainWindow : public QMainWindow
{
...
 virtual void closeEvent(QCloseEvent *event);
... 
};

 



а в файле реализации непосредственно сам метод:
 

void MainWindow::closeEvent(QCloseEvent* event)
{
  int quit = QMessageBox::information(this,  
                  "Realy quit?", "Are you sure?", tr("Yes"), tr("No"));
  quit == 0 ?  event->accept(): event->ignore();
}
 
и не забываем прописать все необходимые инклюды в начале страницы:
 
#include "qmessagebox"
#include "qcloseevent" 
 


Теперь любая попытка закрыть данное окно приведет к появлению 
вашего сообщения.


четверг, 12 декабря 2013 г.

Облегченное консольное приложение с дебагом

Облегченное консольное приложение с дебагом


#include <QDebug> // для вывода отладочной информации
#include <QTextStream>      // для потокового ввода/вывода

int main()
{
    QTextStream cin(stdin);     // связываем текстовый поток со 
                                // стандартным потоком ввода
    QTextStream cout(stdout);   // аналогично для стандартного потока  
                                // вывода

    cout.setCodec("CP866");     // для DOS зададим кодовую страницу

    int a = 0;
    cout << QString::fromUtf8("Введите значение: "), cout.flush();
    cin >> a;
    cout << QString::fromUtf8("Вы ввели a=") << a;

    qDebug() << "Введенное значение:" << a;
    
    return 0;
}
 
 
 
Вывод отладочной информации осуществляется с помощью статического? метода
qDebug. Всего подобных методов 4 с соответствующим характером действия:

  • qDebug()
  • qWarning()
  • qCritical()
  • qFatal()

отключить их можно с помощью директивы компилятора QT_NO_DEBUG_OUTPUT

Qt. Как вывести сообщение пользователю?

Как вывести сообщение пользователю?

для этого существует класс QMessageBox.

Использовать его можно так:

        QMessageBox msg;
    msg.setText(tr("Вы действительно хотите выйти?"));
    msg.setStandardButtons(QMessageBox::Yes | QMessageBox::No);
    msg.setDefaultButton(QMessageBox::No);
    msg.setDetailedText(tr("Что вам тут сказать?<br>это<h1>HTML</h1>"));
        if (msg.exec() == QMessageBox::Yes)
        ...
 
Или через статические методы:
 
    int ret = QMessageBox::information(this,  
               "Статическое сообщение",  
               "Ну это сообщение, не видишь?", 
               QMessageBox::Ok | QMessageBox::Cancel | QMessageBox::Abort, 
               QMessageBox::Ok 
            ); 
 
из аналогичных статических методов доступны:
     information()
     question()
     warning()
     critical()  
с соответствующим предназначением.