Вставка Watermark в поток печати

106
18 декабря 2020, 05:10

Microsoft говорит нам, что мы можем модифицировать поток печати посредством разработки плагинов для драйвера печати

И даже предоставляет пример того, как это делается (watermarkuni). Я скомпилировал проект и получил .dll, зарегистрировал .dll, как COM объект в системе с зарезервированным GUID.

Затем сделал простое console приложение, которое загружает этот COM объект и может вызывать реализованные функции интерфейса библиотеки.

int main(int argc, char *argv[])
{
    cout << "Initializing  COM" << endl;
    if (FAILED(CoInitialize(NULL)))
    {
        cout << "Unable to initialize COM" << endl;
        return 0;
    }
    CLSID clsid;
    HRESULT hr = ::CLSIDFromProgID(L"My.PSWmark.1", &clsid);
    if (FAILED(hr))
    {
        cout << "Unable to get CLSID " << endl;
        return 0;
    }
    IClassFactory* pCF;
    hr = CoGetClassObject(clsid, CLSCTX_INPROC, NULL, IID_IClassFactory, (void**)&pCF);
    if (FAILED(hr))
    {
        cout << "Failed to GetClassObject " << endl;
        return 0;
    }
    IWmarkUni* pWmark;
    hr = pCF->CreateInstance(NULL, IID_IPrintOemUni, (void**)&pWmark);
    //pCF->Release();
    if (FAILED(hr))
    {
        cout << "Failed to create server instance " << endl;
        return 0;
    }
    cout << "Instance created" << endl;
    DRVENABLEDATA   enData;
    PDEVOEM         pOEM;
    DWORD version   = 0;
    DWORD size      = 0;
    pWmark->EnableDriver(version,size,&enData);
    while (1);
}

В отладке я вижу, что приложение подключилось к объекту и вызываемые методы (pWmark->EnableDriver) действительно вызываются. Однако, хуки, описанные в ddihook.cpp watermarkuni не срабатывают.

P.S. Я понимаю, что это просто демопример, но одновременно не до конца понимаю, каким образом предоставляемый Microsoft IPrintOemUni должен взаимодействовать с физическим потоком печати реального принтера, чтобы обеспечить описываемую в доках возможность производить"controlling PCL data injected in the printing stream". ЧЯДНТ?

READ ALSO
Чтение бинарных данных из std::wifstream

Чтение бинарных данных из std::wifstream

Необходимо считать в std::string байты файлаОдно из требований: поддержка юникодных имен файлов

134
Примеры указателей в с++ [закрыт]

Примеры указателей в с++ [закрыт]

Хотите улучшить этот вопрос? Переформулируйте вопрос так, чтобы он был сосредоточен только на одной проблеме

92
Qt5: как обновить данные в QTableWidget

Qt5: как обновить данные в QTableWidget

Есть некоторая таблица в которую из базы данных через промежуточную структуру подгружаются данные(вектор объектов класса)В структуре данные...

106