
Смышленный
  
Профиль
Группа: Завсегдатай
Сообщений: 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
|