Mr.KTO blog

Архив рубрики «C++»

Отслеживание пользователя, скачавшего .exe

24 октября 2011

Уж не помню зачем это нужно.
Но суть в том, чтобы пользователь (зарегистрированный или анонимный), скачивающий триал вашей программы с сайта как-то учитывался. Чтобы программа "знала" откуда он пришёл (affid, referer, контекст/adsense/тизеры, seo/запрос в поисковике, др. рекламная компания).

Для этого нужно при скачивании как-то передать, скажем PHPSESSID установщику вашего софта, фактически .exe-файлу.
Вот варианты:

  1. Отслеживать как-то по ip-адресу, лазить в кукисы браузеров на локальном компе... Ненадёжно и малореально.
  2. Добавить sessid в имя скачиваемого файла, – и при установке проверить Application->ExeName | GetModuleFileName.
    (Вообще, это неплохой приём, например, для портативных версий софта).

    <?php
    header("Cache-Control: private");
    header("Content-Length: 123456");
    header("Content-Type: application/octet-stream");
    header("Expires: Sun, 23 Oct 2011 22:15:21 GMT");
    header("Content-Disposition: attachment;filename=bs_637653-jnFT6TYu.exe");
  3. И вот, собственно, моя идея:
    Как правило, даже после компиляции программы, в её бинарном виде всё-равно остаются строки с названием контролов: Label-ов/Edit-ов. Можно создать скрытый (аттрибут hiden) Edit1 и вписать туда что-то вроде: "MYPROGSESSID=_____=ENDOFSESSID" (если используете инсталлятор - то найти способ оставить метку там).
    Теперь скомпилировать исполняемый файл, проверить что текст нашей строки не изменился, открыв в любом hex-редакторе (UltraEdit напр.)
    Дальше идёт PHP-скрипт скачки, кот. до стандартных хидеров ещё и модифицирует .exe-файл:

    str_replace("MYPROGSESSID=_____=ENDOFSESSID", $_REQUEST['PHPSESSID']);
  4. (Для ускорения процесса можно кешировать позицию этой строки в файле ($pos = stripos()), проверив дату модификации файла (filemtime(), после чего fopen(, "wb"); fseek(, $pos); fwrite();)
    Собственно, этот способ не ограничивается Edit1-контролом. Вы можете попробовать добавить файл с определённой строкой-токеном в ресурсы (не представляю как это делается :lol:), добавить определённый файл картинки в инсталлятор (попросив «установить» его в %programfiles%), после чего прочитать его из уже установленной программы.

____________
Подписка на рубрику C++/Шаровара - теперь БЕСПЛАТНО! Да, купон на скидку 99.7% без НДС.

Первая запись в рубрике C++

27 января 2010

Пожалуй, пока я не буду открывать отдельный блог для записей по теме программирования на языке C++. Посмотрим что из этого выйдет. А пока можете подписаться на рубрику c++.

Я начал программировать на СИ до увлечения веб-программированием и собственно PHP. Собственно, и php мне практически не пришлось изучать из-за похожести языков, достаточно было только мануала.

В качестве среды разработки сейчас я использую Borland C++ Builder 6.0.

Сегодня хочу привести пример, насколько стало велико желание красоту кода php перенести в программы на c++. Допустим есть некая функция, которая возвращает какое-то число результов.

int c() {
    return 3;
}

И мы хотим проверить, есть ли рельтаты (c()!=0) при этом записав это число в переменной (d=c()). В php это выглядело бы так: if ($d = c()). В c++ это вызовет Warning: Possibly incorrect assignment. И правильным решением было бы просто в Project/Options/Compiller/Warnings отключить уведомление об этом ворнинге (как многие). Но мы ведь идеалисты, чёрты бы их всех побрал, и для нас нет простых путей. Мы напишем: if (true == (d = c())). И всё будет верно, пока ф-ция c() возвращает 1 или 0. Но для return 3; это условие окажется ложным. Всё потому, что при сравнения int-овского типа с bool-евским в СИ (по крайней мере в компиляторе BCB) bool преобразуется в int. Получается if (1 == (3)). Значит, нам следовало писать: if (true == (bool)(d = c())).
Соответственно, более простой вариант:

if ((d = c()) > 0)
if (0 != (d = c())) // или:
if ((bool)(d = c()))

Для PHP тоже надо быть внимательными. В то время, как if (true == $d = c()) (скобки можно убрать из-за приоритета операторов) даст ожидаемое true == true. Если мы хотим сравнить какию-то числовую константу с переменной, потенциально содержащей bool-значение: if (true == 2) // if ($mode == AUTO). То для получения нужного нам результата сравнения (2==2) нужно не забыть преобразовать тип к int (if ((int)$mode == AUTO)).

-------------------------------------------------

Далее »

include_once() в C++

1 сентября 2009

Только недавно до меня дошло :), зачем нужен такой код в *.h хедер-файлах:

#ifndef Unit1H
#define Unit1H

// содержимое Unit1.h (заголовки функций...)
// будет исполнено только 1 раз

#endif

По идее то же можно использовать и для PHP. Вдруг кому-то пригодится:

if (!defined('filePHP')):
define("filePHP", 1);

// содержимое php-файла, выполняемое 1 раз

endif;
Страница 1 из 11