Гобелен - кликните для возврата на главную
Не прошло и месяца а Фурмановская ЦРБ в очередной раз попала в историю. На этот раз сотрудница клеветала на пациентов, а именно огласку получил случай когда сотрудница назвала пациента алкашём.
Так почему бы не начать использовать обход блокировки YouTube при том что техническая возможность используя расширение nikolaevevge для браузера Mozilla Firefox уже появилась, а объем полезной(и не очень) информации на видеохостинге YouTube, по мнению некоторых диванных экспертов, меньше не стал.
Ровно 3 года назад произошло событие, которое подарило жителям планеты Змеля новый чистый праздник 6 апреля - в этот замечательный день земля забрала гнить негодяя и СПАМера Владимира Вольфовича Жириновского.
Как бы не обстояли дела в области культуры и IT-технологий, Самосвал писал статьи на связанные темы и планирует ещё написать.
На очередном конкурсе танцев, школьница отлично выступила.
Вот та самая информация: программа для продвижения канала YouTube, эта информация выложена уже несколько лет, при этом просмотров не много, а метод который описан в данном видео действительно помогает продвигать видео в YouTube.
Начал разбираться с информацией которая находится в HTTPS клиентском запросе рукопожатия.
Обратите внимание! Объект изображённый на гобилене может отличаться от общепринятого вида описанного объекта. Тут дело в том что художник видит именно так!
// StringUtils.h
#ifndef STRINGUTILS_H
#define STRINGUTILS_H
#include <System.hpp> // Для AnsiString
class StringUtils {
public:
// Простая функция реверса строки
static AnsiString ReverseString(const AnsiString& str) {
AnsiString result;
for (int i = str.Length(); i >= 1; i--) {
result += str[i];
}
return result;
}
// Пример STDMETHOD (имитация COM-интерфейса)
// struct IStringOperations : public IUnknown {//Обратите внимание эти 3 строки закомментированы, они не требуются для реализации задачи - проверено работает без них
// virtual STDMETHODIMP Reverse(BSTR input, BSTR* output) = 0;
// };
};
#endif
#include <vcl.h>
#include "StringUtils.h"
#pragma hdrstop
#include "Unit1.h"
//---------------------------------------------------------------------------
#pragma package(smart_init)
#pragma resource "*.dfm"
TForm1 *Form1;
//---------------------------------------------------------------------------
__fastcall TForm1::TForm1(TComponent* Owner)
: TForm(Owner)
{
}
//---------------------------------------------------------------------------
void __fastcall TForm1::ButtonReverseClick(TObject *Sender)
{
// 1. Простой вызов функции
AnsiString original = EditInput->Text;
AnsiString reversed = StringUtils::ReverseString(original);
MemoOutput->Lines->Add("Результат: " + reversed);
// 2. Пример с STDMETHOD (имитация COM)
BSTR input = WideString(original).Copy();
BSTR output = NULL; // Исправлено: NULL вместо nullptr
// Создаем "псевдо-COM" объект
class TStringOp : public StringUtils::IStringOperations {
public:
STDMETHODIMP QueryInterface(const IID&, void**) { return E_NOTIMPL; }
STDMETHODIMP_(ULONG) AddRef() { return 1; }
STDMETHODIMP_(ULONG) Release() { return 1; }
STDMETHODIMP Reverse(BSTR input, BSTR* output) {
if (!output) return E_POINTER; // Проверка указателя
AnsiString str(input);
*output = WideString(StringUtils::ReverseString(str)).Copy();
return S_OK;
}
} op;
if (SUCCEEDED(op.Reverse(input, &output))) {
MemoOutput->Lines->Add("COM-версия: " + AnsiString(output));
SysFreeString(output);
}
SysFreeString(input);
}
Я хотя и несколько знаком с C++(а так же нормально знаком с другими языками, например PHP) тем не менее я лишь примерно понимаю что происходит в class TMyCustomObject. Позже я предлагаю более детально разобрать каждую строчку этого класса, то-есть что делает каждая функция в нём. При этом приведите для начала простой пример как используется STDMETHOD в подключаемых h файлах на более простом примере. Предлагаю взять пустой проект и к примеру разместить на нём поле ввода. пусть в подключаемом файле выполняется метод по разворачиванию текста наоборот (пример "абвгд" станет "дгвба") и далее пусть этот результат добавляется к полю ввода новой строкой. Запуск процедуры пусть производится по нажатию кнопки. Если приведённый мной вариант примера не информативный для изучения рассматриваемого вопроса, предложите другой вариант.
Отличный подход к изучению! Давайте создадим максимально простой, но информативный пример. Я предлагаю сделать проект с:
File → New → Application
Разместите на форме:
// StringUtils.h
#ifndef STRINGUTILS_H
#define STRINGUTILS_H
#include <System.hpp> // Для AnsiString
class StringUtils {
public:
// Простая функция реверса строки
static AnsiString ReverseString(const AnsiString& str) {
AnsiString result;
for (int i = str.Length(); i >= 1; i--) {
result += str[i];
}
return result;
}
// Пример STDMETHOD (имитация COM-интерфейса)
struct IStringOperations : public IUnknown {
virtual STDMETHODIMP Reverse(BSTR input, BSTR* output) = 0;
};
};
#endif
// Unit1.cpp
#include "StringUtils.h"
// Обработчик кнопки
void __fastcall TForm1::ButtonReverseClick(TObject *Sender)
{
// 1. Простой вызов функции
AnsiString original = EditInput->Text;
AnsiString reversed = StringUtils::ReverseString(original);
MemoOutput->Lines->Add("Результат: " + reversed);
// 2. Пример с STDMETHOD (имитация COM)
BSTR input = SysAllocString(original.c_str());
BSTR output;
// Создаем "псевдо-COM" объект
class TStringOp : public StringUtils::IStringOperations {
STDMETHODIMP QueryInterface(const IID&, void**) { return E_NOTIMPL; }
STDMETHODIMP_(ULONG) AddRef() { return 1; }
STDMETHODIMP_(ULONG) Release() { return 1; }
STDMETHODIMP Reverse(BSTR input, BSTR* output) {
AnsiString str(input);
*output = SysAllocString(StringUtils::ReverseString(str).c_str());
return S_OK;
}
} op;
if (SUCCEEDED(op.Reverse(input, &output))) {
MemoOutput->Lines->Add("COM-версия: " + AnsiString(output));
SysFreeString(output);
}
SysFreeString(input);
}
Простая функция (ReverseString):
static AnsiString ReverseString(const AnsiString& str) {
AnsiString result;
for (int i = str.Length(); i >= 1; i--) {
result += str[i]; // Конкатенация символов в обратном порядке
}
return result;
}
STDMETHOD в COM-интерфейсе:
struct IStringOperations : public IUnknown {
// STDMETHODIMP - макрос для объявления методов COM
virtual STDMETHODIMP Reverse(BSTR input, BSTR* output) = 0;
};
STDMETHODIMP Reverse(BSTR input, BSTR* output) {
// 1. Конвертируем BSTR в AnsiString
AnsiString str(input);
// 2. Вызываем нашу функцию реверса
AnsiString reversed = StringUtils::ReverseString(str);
// 3. Возвращаем результат как BSTR
*output = SysAllocString(reversed.c_str());
return S_OK; // Успешное выполнение
}
Элемент | Описание |
STDMETHODIMP | Определяет метод как часть COM-интерфейса (возвращает HRESULT) |
QueryInterface | Позволяет запрашивать интерфейсы (в примере не реализован) |
AddRef/Release | Управление подсчетом ссылок (упрощенно) |
BSTR | Строковый тип, используемый в COM (WideString) |
SysAllocString | Выделение памяти для BSTR |
SysFreeString | Освобождение памяти BSTR |
SUCCEEDED | Проверка успешности HRESULT |
при нажатии кнопки:
Если хотите совсем просто - можно ограничиться только функцией:
// StringUtils.h
namespace StringUtils {
AnsiString ReverseString(const AnsiString& str);
}
// Unit1.cpp
void __fastcall TForm1::ButtonReverseClick(TObject *Sender)
{
MemoOutput->Lines->Add(
StringUtils::ReverseString(EditInput->Text)
);
}
Этот пример специально сделан максимально простым, но показывает:
Вы так же можете прочитать следующие статьи: