Модераторы: Poseidon, Snowy, bems, MetalFan
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> MMF, Нужно объяснение - не использовал раньше 
:(
    Опции темы
aktuba
Дата 30.5.2007, 05:52 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


Профиль
Группа: Завсегдатай
Сообщений: 1915
Регистрация: 24.4.2006
Где: Планета Земля

Репутация: 16
Всего: 38



Так-с... Проблема такая - есть программа, написанная на С++, которая через MMF может принять файл, обработать его и вернуть результат. Вот код, который позволяет это делать на C++:
Код

#include "PhotoshopSDK.h"
#include <tchar.h>

//#include "resource.h"
#define IDD_DIALOG1                     101
    /*
#define    VERSION_5_COMPATIBLE
    */

bool vidimo_corel = true;

FilterRecord * gFilterRecord;
int32 * gData;
int16 * gResult;
SPBasicSuite * sSPBasic = NULL;

void DoAbout(void);
void DoParameters(void);
void DoPrepare(void);
void DoStart(void);
void DoContinue(void);
void DoFinish(void);

HINSTANCE    Instance;
HANDLE            EventClose        = INVALID_HANDLE_VALUE;
HANDLE            EventCrash        = INVALID_HANDLE_VALUE;
HANDLE            EventDialog        = INVALID_HANDLE_VALUE;
HWND                PluginDialog        = NULL;
HWND                PluginExec        = NULL;
//============================================================================================================================    //
HINSTANCE                            GetDLLInstance        ( SPPluginRef plugin ){ return Instance; }
//============================================================================================================================    //
BOOL                APIENTRY        DllMain                        ( HINSTANCE hModule, DWORD ul_reason_for_call, LPVOID lpReserved )
//============================================================================================================================    //
{
    Instance = hModule;    return TRUE;
}
//============================================================================================================================    //
INT_PTR            CALLBACK        PluginDialogFunc        ( HWND hwnd, UINT msg, WPARAM wparam, LPARAM lparam )
//============================================================================================================================    //
{
    switch ( msg )
    {
        case WM_COMMAND    :    ::EndDialog ( hwnd, lparam );    return TRUE;
        case WM_INITDIALOG    :
        {
            PluginDialog = hwnd;    ::SetEvent ( EventDialog );

            RECT rect;    ::GetWindowRect ( hwnd, & rect );    ::SetWindowPos ( hwnd, NULL, - ( rect.right - rect.left ), - ( rect.bottom - rect.right ), 0, 0, SWP_NOZORDER | SWP_NOSIZE );

            return TRUE;
        }
        case WM_ACTIVATE        :    if( wparam != WA_INACTIVE )
        {
            HWND hwnd = PluginExec;

            if(        ::GetWindow                                (hwnd,GW_OWNER) == NULL)
            {
                if(!    ::IsWindowVisible                            (hwnd)) return TRUE;
                if(    ::IsIconic                                        (hwnd)) 
                    ::ShowWindow                            (hwnd,SW_RESTORE);
                    hwnd=::GetLastActivePopup        (hwnd);
                if(    hwnd )::SetForegroundWindow    (hwnd);
            }
            break;
        }
    }
    return FALSE;
}
//============================================================================================================================    //
DWORD            WINAPI            DoWait                    ( void * p )
//============================================================================================================================    //
{
    try
    {
        ::WaitForSingleObject ( EventDialog, INFINITE );

        while ( true )
        {
            if( ::WaitForSingleObject ( EventClose, 1000 ) != WAIT_TIMEOUT ){        ::PostMessage ( PluginDialog, WM_COMMAND, 0, IDOK            );    break;        }
            if( ::WaitForSingleObject ( EventCrash,       0 ) != WAIT_TIMEOUT ){        ::PostMessage ( PluginDialog, WM_COMMAND, 0, IDCANCEL    );    break;        }
        }
    }
    catch (...){                                                                                                        ::PostMessage ( PluginDialog, WM_COMMAND, 0, IDCANCEL    );    return -1;    }

    return 0;
}
//============================================================================================================================    //
DLLExport SPAPI void PluginMain ( const int16 selector, void * filterRecord, int32 * data, int16 * result )
//============================================================================================================================    //
{
    gData = data;
    gResult = result;
    
    if (selector == filterSelectorAbout)
    {
        sSPBasic = ((AboutRecordPtr)filterRecord)->sSPBasic;
    } 
    else 
    {
        gFilterRecord = (FilterRecordPtr)filterRecord;
        sSPBasic = gFilterRecord->sSPBasic;

        if( ! vidimo_corel )
        {
            try
            {
                if (gFilterRecord->bigDocumentData != NULL)
                    gFilterRecord->bigDocumentData->PluginUsing32BitCoordinates = true;
            }
            catch(...){}
        }
    }

    switch (selector)
    {
        case filterSelectorAbout:                DoAbout            ();        break;
        case filterSelectorParameters:        DoParameters    ();        break;
        case filterSelectorPrepare:            DoPrepare        ();        break;
        case filterSelectorStart:                DoStart            ();        break;
        case filterSelectorContinue:            DoContinue        ();        break;
        case filterSelectorFinish:                DoFinish            ();        break;
        default:            *gResult = filterBadParameters;                break;
    }
}
//============================================================================================================================    //
void DoAbout(void)
//============================================================================================================================    //
{
    AboutRecord * aboutRecord = reinterpret_cast<AboutRecord *>(gFilterRecord);
    DoAbout(static_cast<SPPluginRef>(aboutRecord->plugInRef), AboutID);
}
//============================================================================================================================    //
void DoParameters(void)
//============================================================================================================================    //
{
}
//============================================================================================================================    //
void DoPrepare(void)
//============================================================================================================================    //
{
    gFilterRecord->bufferSpace = 0;
    gFilterRecord->maxSpace = 0;
}
//============================================================================================================================    //
void DoContinue(void)
//============================================================================================================================    //
{
    VRect outRect = { 0, 0, 0, 0};
    SetOutRect(outRect);
}
//============================================================================================================================    //
void DoFinish(void)
//============================================================================================================================    //
{
}
//============================================================================================================================    //
void DoStart(void)
//============================================================================================================================    //
{
    {
        // PREPARE SOURCE

        VRect outRect = GetOutRect();
        VRect filterRect = GetFilterRect();

        int sx = filterRect.right        - filterRect.left;
        int sy = filterRect.bottom    - filterRect.top;

        vidimo_corel = false;

        int planes    = gFilterRecord->planes;        if( gFilterRecord->filterCase > 2 )    planes = gFilterRecord->outLayerPlanes;        if( planes <= 0 ) planes = 3, vidimo_corel = true;
        int depth    = gFilterRecord->depth;        if( depth <= 0 ) depth = 8, vidimo_corel = true;
        int bpp        = planes * depth / 8;
        int size        = sx * sy * bpp;

        if( ! vidimo_corel )
        {
            try
            {
                if (gFilterRecord->bigDocumentData != NULL)
                    gFilterRecord->bigDocumentData->PluginUsing32BitCoordinates = true;
            }
            catch(...){}
        }

        gFilterRecord->outLoPlane = 0;
        gFilterRecord->outHiPlane = planes-1;

        SetOutRect ( filterRect );

        *gResult = gFilterRecord->advanceState ();        if (*gResult != kNoErr) return;

        outRect = GetOutRect ();

        int pitch    = gFilterRecord->outRowBytes;

        // CREATE MAPFILE

        LPCTSTR signature = TEXT ( "FILE {21125BC9-69D1-4ccc-9FF1-088496AD9242}" );



        HANDLE file = ::CreateFileMapping 
        (
            INVALID_HANDLE_VALUE,    // handle to file to map
            NULL,                                        // optional security attributes
            PAGE_READWRITE,                // protection for mapping object
            0,                                                // high-order 32 bits of object size
            size + 28,                                    // low-order 32 bits of object size
            signature                                    // name of file-mapping object
        );

        if( ! file ) return;        //        MessageBox ( NULL, "create", "launch", MB_OK );

        void * view = ::MapViewOfFile
        ( 
            file,                                            // file-mapping object to map into  address space
            FILE_MAP_ALL_ACCESS,        // access mode
            0,                                                // high-order 32 bits of file offset
            0,                                                // low-order 32 bits of file offset
            0                                                // number of bytes to map
        );

        if( ! view ){ ::CloseHandle ( file ); return; }        //        MessageBox ( NULL, "view", "launch", MB_OK );

        // PREPARE DATA

        unsigned char * src = ( unsigned char * ) gFilterRecord->outData;
        unsigned char * dst = ( unsigned char * ) view;

        //        TCHAR ss [ 1024 ];        _stprintf ( ss, TEXT ( "sx = %d sy = %d planes % d depth = %d pitch = %d bpp = %d size = %d src = %08X dst = %08X" ), sx, sy, planes, depth, pitch, bpp, size, src, dst );        MessageBox ( NULL, ss, "launch", MB_OK );

        int                hs            = 28;        // header size
        int                rc            =   0;        // apply or cancel
        HWND        hwnd    = NULL;    // launched application main window

        ::memcpy ( dst, & hs,        4 );    dst += 4;
        ::memcpy ( dst, & sx,        4 );    dst += 4;
        ::memcpy ( dst, & sy,        4 );    dst += 4;
        ::memcpy ( dst, & planes,    4 );    dst += 4;
        ::memcpy ( dst, & depth,    4 );    dst += 4;
        ::memcpy ( dst, & rc,            4 );    dst += 4;
        ::memcpy ( dst, & hwnd,    4 );    dst += 4;

        for( int h = sy; h > 0; h-- )
        {
            ::memcpy ( dst, src, sx * bpp );        src += pitch;        dst += sx * bpp;
        }

        // LAUNCH EXTERNAL FILTER

        HANDLE crash        = ::CreateEvent ( NULL, TRUE, FALSE, TEXT ( "CRASH {21125BC9-69D1-4ccc-9FF1-088496AD9242}" ) );
        HANDLE event        = ::CreateEvent ( NULL, TRUE, FALSE, TEXT ( "EVENT {21125BC9-69D1-4ccc-9FF1-088496AD9242}" ) );
        HANDLE startup        = ::CreateEvent ( NULL, TRUE, FALSE, TEXT ( "START {21125BC9-69D1-4ccc-9FF1-088496AD9242}" ) );
        {
            TCHAR path [ MAX_PATH ];

            int n = ::GetModuleFileName ( ::GetModuleHandle ( TEXT( "Smilart Photo Plugin.8bf" ) ), path, sizeof ( path ) );    //        MessageBox ( NULL, path, "path", MB_OK );

            path [ n - 1 ] = TEXT ( 'e' );
            path [ n - 2 ] = TEXT ( 'x' );
            path [ n - 3 ] = TEXT ( 'e' );

            ::ShellExecute ( NULL, TEXT( "open" ), path, TEXT( "" ), TEXT( "" ), SW_MAXIMIZE );
        }

        // CONTROL EXTERNAL FILTER

        if(    startup    &&    startup    != INVALID_HANDLE_VALUE &&
            event    &&    event    != INVALID_HANDLE_VALUE &&
            crash    &&    crash    != INVALID_HANDLE_VALUE &&
            ::WaitForSingleObject ( startup, 5*60*1000 ) == WAIT_OBJECT_0 )
        {
            EventDialog        = ::CreateEvent ( NULL, TRUE, FALSE, NULL );
            EventClose        = event;
            EventCrash        = crash;
            PluginDialog        = NULL;
            PluginExec        = (HWND) * ( ( ( int * ) view ) + 6 );

            DWORD id;        ::CloseHandle ( ::CreateThread ( NULL, 0, DoWait, NULL, 0, & id ) );

            INT_PTR  dialog_rc = ::DialogBox ( Instance, MAKEINTRESOURCE ( IDD_DIALOG1 ), GetActiveWindow (), PluginDialogFunc );        if( dialog_rc != IDOK )
            {
                ::MessageBox ( NULL, TEXT ( "Sorry for inconvenience." ), TEXT ( "Smilart Photo Plugin Crash" ), MB_OK | MB_SETFOREGROUND | MB_TOPMOST );
            }
            else        // UPDATE DATA
            {
                rc = * ( ( ( int * ) view ) + 5 );        if( rc )
                {
                    dst = ( unsigned char * ) gFilterRecord->outData;
                    src = ( unsigned char * ) view + hs;

                    for( int h = sy; h > 0; h-- )
                    {
                        ::memcpy ( dst, src, sx * bpp );        dst += pitch;        src += sx * bpp;
                    }
                }
                else
                {
                    VRect zeroRect = { 0, 0, 0, 0 };

                    SetInRect(zeroRect);
                    SetOutRect(zeroRect);
                    SetMaskRect(zeroRect);

                    * gResult = userCanceledErr;
                }
            }
            ::CloseHandle ( EventDialog );
        }

        ::CloseHandle ( crash );
        ::CloseHandle ( event );
        ::CloseHandle ( startup );

        ::UnmapViewOfFile    ( view );
        ::CloseHandle            ( file );
    }

    return;
}
//============================================================================================================================    //


Как теперь проделать тоже самое из Delphi? Если у кого есть опыт - очень нужна помощь, с меня + за объяснение или код...

Присоединённый файл ( Кол-во скачиваний: 3 )
Присоединённый файл  Invert.cpp 12,49 Kb


--------------------
user posted image
PM MAIL WWW Skype   Вверх
MetalFan
Дата 30.5.2007, 09:03 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



а что там сложного то? тебе весь код надо перевести чтоль?
сорь, счас напряг со временем, но....
смысл работы с MMF в двух словах:
1) CreateFileMapping (OpenFileMapping ) - Создает или открывает (только открывает) объект MMF. в случае задания в первом параметре INVALID_HANDLE_VALUE - имеем MMF, память для которого будет браться из файла подкачки.
2) для доступа(отражения в наше АП) всего или части MMF необходимо выполнить функцию MapViewOfFile, результат выполнения которой есть адрес в АП вызывающего процесса, по которому начинаются "отраженные" данные.

в приведенном куске программы создается MMF, отражается в АП, в него заносятся данные.
затем создается Event (strartup), производится запуск внешнего EXE, затем ожидается срабатываение данного Event'a, что видимо означает, что необходимый exe стартанул... затем показывается некая форма... после которой происходит обновление и закрытие MMF.... и завершение работы вроде как...

Это сообщение отредактировал(а) MetalFan - 30.5.2007, 09:05


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
aktuba
Дата 30.5.2007, 10:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


Профиль
Группа: Завсегдатай
Сообщений: 1915
Регистрация: 24.4.2006
Где: Планета Земля

Репутация: 16
Всего: 38



Цитата

затем создается Event (strartup)


Вот этот момент поподробнее... Все остальное нашел, а вот насчет event-ов хотелось бы узнать подробнее, т.к. в данном случае их необходимо 3 штуки...


--------------------
user posted image
PM MAIL WWW Skype   Вверх
ne0n
Дата 30.5.2007, 15:51 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


PlayBoy
**


Профиль
Группа: Участник
Сообщений: 733
Регистрация: 5.8.2005
Где: Н.Новгород

Репутация: 1
Всего: 11



сам особо не работал, но мож этот исходник поможнт smile 

Присоединённый файл ( Кол-во скачиваний: 8 )
Присоединённый файл  mmf.rar 5,68 Kb
PM MAIL ICQ   Вверх
aktuba
Дата 30.5.2007, 16:53 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


Профиль
Группа: Завсегдатай
Сообщений: 1915
Регистрация: 24.4.2006
Где: Планета Земля

Репутация: 16
Всего: 38



Это исходник у меня есть... Брал на  rouse.drkb.ru. Исходник хороший и понятной, но без эвентов =(((


--------------------
user posted image
PM MAIL WWW Skype   Вверх
MetalFan
Дата 30.5.2007, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



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

Это сообщение отредактировал(а) MetalFan - 30.5.2007, 17:52


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
dumb
Дата 30.5.2007, 17:43 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


sceloglauxalbifacies
****


Профиль
Группа: Экс. модератор
Сообщений: 2929
Регистрация: 16.6.2006

Репутация: 13
Всего: 158



aktuba, а что тебе в эвентах непонятно? - в данном случае используется просто как system-wide флаг... если указывается имя, то можно его "дергать" из других процессов.
PM MAIL   Вверх
aktuba
Дата 30.5.2007, 17:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Смышленный
***


Профиль
Группа: Завсегдатай
Сообщений: 1915
Регистрация: 24.4.2006
Где: Планета Земля

Репутация: 16
Всего: 38



MetalFan, да код то мне понятен вроде... просто опыта нету, думал может кто что умное подскажет  smile 




--------------------
user posted image
PM MAIL WWW Skype   Вверх
MetalFan
Дата 30.5.2007, 18:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Аццкий Сотона
****


Профиль
Группа: Комодератор
Сообщений: 3815
Регистрация: 2.10.2006
Где: Moscow

Репутация: 62
Всего: 128



Цитата(aktuba @  30.5.2007,  17:57 Найти цитируемый пост)
думал может кто что умное подскажет

ну тык... ты задай конкретный вопрос, получишь конкретный ответ ;)
а что умное подсказать? почитай Рихтера или Руссиновича про использование MMF и Event'ов  smile 


--------------------
There are always someone smarter than you...
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Общие вопросы"
SnowyMetalFan
bemsPoseidon
Rrader

Запрещается!

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами

  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи


Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Snowy, MetalFan, bems, Poseidon, Rrader.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0593 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.