рд╣рдо .NET рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ Unmanaged C ++ рдХреЛрдб рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рддреЗ рд╣реИрдВ

рдЫрд╡рд┐



рдЖрдЬ, рдореИрдВ (рдЬреИрд╕реЗ, рд╢рд╛рдпрдж, рдХрдИ рдЕрдиреНрдп рдкреНрд░реЛрдЧреНрд░рд╛рдорд░), рдореИрдВ .NET рдкреНрд▓реЗрдЯрдлрд╝реЙрд░реНрдо рдФрд░ рд╕реА # рднрд╛рд╖рд╛ рдХрд╛ рдЕрдзрд┐рдХ рд╕реЗ рдЕрдзрд┐рдХ рдЙрдкрдпреЛрдЧ рдХрд░рддрд╛ рд╣реВрдВ, рд▓реЗрдХрд┐рди рдлрд┐рд░ рднреА рдРрд╕реЗ рдХреЛрдиреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рд╕реА ++ рдХрд╛ рдЙрдкрдпреЛрдЧ рдЙрдЪрд┐рдд рд╣реИред рдЗрд╕рд╕реЗ рдЙрдирдХреЗ рдПрдХреАрдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдкреИрджрд╛ рд╣реЛрддреА рд╣реИред



рдХреНрдпреЛрдВ?

рдпреЗ рд╕рд┐рд░реНрдл рдореБрдЦреНрдп рдХрд╛рд░рдг рд╣реИрдВ, рд╕реВрдЪреА рдкреВрд░реА рддрд░рд╣ рд╕реЗ рджреВрд░ рд╣реИред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЬрд░реВрд░рдд рд╣реИ, рддреЛ рд╕рдорд╛рдзрд╛рди рднреА рд╣реИрдВред



рд╣реИрдмрд░рдХрдЯ рд╕реЗ рдкрд╣рд▓реЗ, рдореИрдВ рддреБрд░рдВрдд рдХрд╣реВрдВрдЧрд╛ рдХрд┐ рд▓реЗрдЦ рдПрдХ рдХреЛ рдмрддрд╛рдПрдЧрд╛ рдФрд░ рджрд┐рдЦрд╛рдПрдЧрд╛, рдЗрд╕ рддрд░рд╣ рдХреА рдмрд╛рддрдЪреАрдд рдХрд╛ рдмрд┐рд▓реНрдХреБрд▓ рдХреНрд▓рд╛рд╕рд┐рдХ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ, рдЬреЛ рдХрдИ рд╡рд╛рд╕реНрддрд╡рд┐рдХ рдЕрдиреБрдкреНрд░рдпреЛрдЧреЛрдВ рдореЗрдВ рдмреЗрд╣рдж рдЙрдкрдпреЛрдЧреА рд╣реЛ рд╕рдХрддрд╛ рд╣реИред



рдХреИрд╕реЗ?

рдЗрдирдореЗрдВ рд╕реЗ рдкреНрд░рддреНрдпреЗрдХ рд╕рдорд╛рдзрд╛рди рдХреЗ рдЕрдкрдиреЗ рдкреЗрд╢реЗрд╡рд░реЛрдВ рдФрд░ рд╡рд┐рдкрдХреНрд╖ рд╣реИрдВред рдЗрд╕ рд▓реЗрдЦ рдХрд╛ рдЙрджреНрджреЗрд╢реНрдп рдЗрди рджреГрд╖реНрдЯрд┐рдХреЛрдгреЛрдВ рдХреЗ рд╕рднреА рдлрд╛рдпрджреЗ рдФрд░ рдиреБрдХрд╕рд╛рди рдХрд╛ рдЕрд╡рд▓реЛрдХрди рдкреНрд░рджрд╛рди рдХрд░рдирд╛ рдирд╣реАрдВ рдерд╛, рд▓реЗрдХрд┐рди рдореИрдВ рдЙрди рдкрд░ рд╕рдВрдХреНрд╖реЗрдк рдореЗрдВ рдмрд╛рдд рдХрд░реВрдВрдЧрд╛ред



рдкреА / рдЖрд╣реНрд╡рд╛рди - рдмрд╣реБрдд рд╕рд░рд▓ рд▓реЗрдХрд┐рди рд▓рдЪреАрд▓рд╛ рдирд╣реАрдВред рдУрдУрдкреА рдХреЗ рд▓рд┐рдП рдХреЛрдИ рд╕рдорд░реНрдерди рдирд╣реАрдВ рд╣реИ, рдПрдХ рдмрд╛рд░ рдореЗрдВ рдХрдИ рддрд░реАрдХреЗ рдмрдирд╛рдирд╛ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдирд╣реАрдВ рд╣реИред



COM рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдФрд░ рдХрд╛рдлреА рд╢рдХреНрддрд┐рд╢рд╛рд▓реА рд╣реИ, рд▓реЗрдХрд┐рди COM рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХреЛ рд╕рд┐рд╕реНрдЯрдо рд░рдЬрд┐рд╕реНрдЯреНрд░реА рдореЗрдВ рдкрдВрдЬреАрдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ, рдФрд░ рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕реНрдерд╛рдкрдирд╛ рдХреЗ рд▓рд┐рдП рдкреНрд░рд╢рд╛рд╕рдХ рдЕрдзрд┐рдХрд╛рд░реЛрдВ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реЛрддреА рд╣реИ (UPD: рдЬреИрд╕рд╛ рдХрд┐ рдЯрд┐рдкреНрдкрдгреА рдореЗрдВ рд╕рд╣реА рдЙрд▓реНрд▓реЗрдЦ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИ, рдЖрд╡рд╢реНрдпрдХ рдирд╣реАрдВ рд╣реИ)ред



C ++ / CLI рдПрдХ рдмрд╣реБрдд рд╣реА рдЕрдЪреНрдЫрд╛ рдПрдХреАрдХрд░рдг рд╣реИ, рдПрдХ рдмрд╣реБрдд рдЕрдЪреНрдЫрд╛ рд╕рдорд╛рдзрд╛рди рд╣реИред рд▓реЗрдХрд┐рди рдЕрдЧрд░ рдЖрдк рдЕрдкрдиреЗ C ++ рдХреЛрдб рдХреЛ / CLI рдХреБрдВрдЬреА рдХреЗ рд╕рд╛рде рд╕рдВрдХрд▓рд┐рдд рдирд╣реАрдВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ, рддреЛ рдЖрдкрдХреЛ рдПрдХ рдЕрддрд┐рд░рд┐рдХреНрдд рдордзреНрдпрд╡рд░реНрддреА C ++ / CLI рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рдкреНрд░рд╡реЗрд╢ рдХрд░рдирд╛ рд╣реЛрдЧрд╛ рдФрд░ рдЗрд╕рдореЗрдВ рдкреНрд░рддреНрдпреЗрдХ рдХреЙрд▓ рдХреЗ рд▓рд┐рдП рд░реИрдкрд░ рд▓рд┐рдЦрдирд╛ рд╣реЛрдЧрд╛ред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рд╕реАрдПрд▓рдЖрдИ рдЕрдХреНрд╕рд░ рдХреЛрдб рдХреЛ рдЬрдЯрд┐рд▓ рдХрд░рддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреА рдХреБрдЫ рд╕реАрдорд╛рдПрдВ рд╣реИрдВред



рдФрд░ рдХреИрд╕реЗ?



рдЗрд╕ рд▓реЗрдЦ рдореЗрдВ, рдореИрдВ COM рдЗрдВрдЯрд░реЙрдк + рдкреА / рдЗрдирд╡реЛрдХ рдкрд░ рдЖрдзрд╛рд░рд┐рдд рдПрдХ рдФрд░ рджрд┐рд▓рдЪрд╕реНрдк рдФрд░ рдмрд╣реБрдд рд╣реА рд╕реБрд░реБрдЪрд┐рдкреВрд░реНрдг рд╕рдорд╛рдзрд╛рди рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрд╛рдд рдХрд░рдирд╛ рдЪрд╛рд╣рддрд╛ рд╣реВрдВ, рдЬрд┐рд╕рд╕реЗ рд╕рд┐рд╕реНрдЯрдо рдореЗрдВ COM рдкрдВрдЬреАрдХрд░рдг рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рдХреЗ рдмрд┐рдирд╛ C # рд╕реЗ C ++ рдХрдХреНрд╖рд╛рдПрдВ рдХреЙрд▓ рдХрд░рдирд╛ рдЖрд╕рд╛рди рд╣реЛ рдЬрд╛рддрд╛ рд╣реИ (рдЖрдкрдХреЗ рдХрд╛рд░реНрдпрдХреНрд░рдореЛрдВ рдХреЛ рдкреЛрд░реНрдЯреЗрдмрд▓ рд▓реЙрдиреНрдЪ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП) рдПрдХ рдлреНрд▓реИрд╢ рдбреНрд░рд╛рдЗрд╡ рд╕реЗ)ред рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╡рд░реНрдЪреБрдЕрд▓ рд╡рд┐рдзрд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╕рдмрд╕реЗ рд╕рд╛рдзрд╛рд░рдг рд╕реА ++ рдХрдХреНрд╖рд╛рдПрдВ рдмрдирд╛рдПрдВрдЧреЗ рдФрд░ рдЙрдиреНрд╣реЗрдВ рдкреА / рдЗрдирд╡реЙрдЗрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рдХреЙрдо рдЗрдВрдЯрд░рдлреЗрд╕ рдХреЗ рд░реВрдк рдореЗрдВ рд╕реА # рдкрд╛рд╕ рдХрд░реЗрдВрдЧреЗред



рдЪрд▓реЛ рд╡реНрдпрд╛рдкрд╛рд░ рдХреЗ рд▓рд┐рдП рдиреАрдЪреЗ рдЙрддрд░реЛред



рд╣рдо рджреЛ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдмрдирд╛рддреЗ рд╣реИрдВред рдПрдХ рд╣реИ рд╕реА ++ (рд╕реАрдПрд▓рдЖрд░ рдФрд░ рдПрдордПрдлрд╕реА рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд┐рдП рдмрд┐рдирд╛, рдпреВрдирд┐рдХреЛрдб рд╕рдХреНрд╖рдо рдХрд░реЗрдВ)ред рдЗрд╕реЗ рд▓рд┐рдм рдХреЗ рд▓рд┐рдП рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП рдХрд╣рд╛ рдЬрд╛рддрд╛ рд╣реИред



рдЫрд╡рд┐

(рдиреЛрдЯ, рдбреАрдмрдЧрд┐рдВрдЧ рдореЗрдВ рдЖрд╕рд╛рдиреА рдХреЗ рд▓рд┐рдП, рдФрд░ рдЖрдЧреЗ рдХреА рдкреНрд░рддрд┐рд▓рд┐рдкрд┐ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдЙрдЯрдкреБрдЯ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд╡рд┐рдВрдбреЛрдЬ рдлрд╝реЛрд▓реНрдбрд░ рдореЗрдВ рдЬрд╛ рд░рд╣реА рд╣реИ)ред



рдЙрд╕рдХреЗ рдмрд╛рдж рд╣рдо C # рдкреНрд░реЛрдЬреЗрдХреНрдЯ - рд╡рд┐рдВрдбреЛрдЬ рдлреЙрд░реНрдо рдмрдирд╛рддреЗ рд╣реИрдВред рдЪрд▓реЛ рдЗрд╕реЗ net2c рдХрд╣рддреЗ рд╣реИрдВред рд╣рдо рдкрд░реАрдХреНрд╖рд╛ рдлреЙрд░реНрдо рдЬрдорд╛ рдХрд░рддреЗ рд╣реИрдВ:



рдЫрд╡рд┐



рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реЗ, рдореБрдЭреЗ рд▓рдЧрддрд╛ рд╣реИ рдХрд┐ рдпрд╣ рдкрд╣рд▓реЗ рд╕реЗ рд╣реА рд╕реНрдкрд╖реНрдЯ рд╣реИ рдХрд┐ рд╣рдорд╛рд░реА рд╕реА ++ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рд▓рдЧрднрдЧ рдХреНрдпрд╛ рдХрд░реЗрдЧреАред



рдЕрдм рд╣рдо C ++ рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкрд░ рд▓реМрдЯрддреЗ рд╣реИрдВ рдФрд░ рдПрдХ рдПрдХрд▓ рдлрд╝рдВрдХреНрд╢рди рд▓рд┐рдЦрддреЗ рд╣реИрдВ рдЬреЛ рд╣рдорд╛рд░реА рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдмрдирд╛рдПрдЧрд╛:



//

enum EObjectType

{

Hello = 0,

GraphicAlgorithm

};

__declspec(dllexport) void * __stdcall Create(EObjectType AType)

{

if (AType == Hello) return new CHello();

if (AType == GraphicAlgorithm) return new CGraphicAlgorithm();

return NULL;

}










рдирд┐рд░реНрдпрд╛рдд рдХрд┐рдП рдЧрдП рдХрд╛рд░реНрдпреЛрдВ рдХреЗ рдирд╛рдореЛрдВ рдХреЛ рд╕рдЬрд╛рдиреЗ рд╕реЗ рдмрдЪрдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдкрдХреЛ рдПрдХ рдФрд░ .DEF рдлрд╝рд╛рдЗрд▓ рдмрдирд╛рдиреЗ рдФрд░ рдЙрд╕рдореЗрдВ рд▓рд┐рдЦрдиреЗ рдХреА рдЖрд╡рд╢реНрдпрдХрддрд╛ рд╣реИ:

EXPORTS

Create








рдПрдХ рд╡рд┐рдХрд▓реНрдк рдХреЗ рд░реВрдк рдореЗрдВ, рдЖрд╡рд╢реНрдпрдХ рд╡рд╕реНрддреБрдУрдВ рдХреЛ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП, рдЖрдк рдПрдХ рдЕрд▓рдЧ рдПрдХрд▓ рд╡рд░реНрдЧ рдмрдирд╛ рд╕рдХрддреЗ рд╣реИрдВ рдЬрд┐рд╕реЗ рдЗрд╕ рдлрд╝рдВрдХреНрд╢рди рджреНрд╡рд╛рд░рд╛ рд╡рд╛рдкрд╕ рдХрд┐рдпрд╛ рдЬрд╛рдПрдЧрд╛, рд▓реЗрдХрд┐рди рдореИрдВ рд╕рдмрд╕реЗ рд╕рд░рд▓ рддрд░реАрдХреЗ рд╕реЗ рдЬрд╛рдКрдВрдЧрд╛ред



рдЕрдм CHello рд╡рд░реНрдЧ рдХреЗ рд▓рд┐рдП рдХреЛрдб:

//

// {08356CFE-A3DD-43c2-980C-1393E37118B2}

static const GUID IID_IHello =

{ 0x8356cfe, 0xa3dd, 0x43c2, { 0x98, 0xc, 0x13, 0x93, 0xe3, 0x71, 0x18, 0xb2 } };

class IHello : public CBaseUnknown

{

public :

STDHRESULTMETHOD SetName(LPWSTR AName) = 0;

STDHRESULTMETHOD Say(HWND AParent) = 0;

};



class CHello :

public IHello

{

public :

STDHRESULTMETHOD QueryInterface( const CLSID &AId, void ** ARet)

{

__super::QueryInterface(AId, ARet);

if (AId == IID_IHello) *ARet = (IHello*) this ;

return (*ARet != NULL) ? S_OK : E_NOINTERFACE;

}

STDHRESULTMETHOD SetName(LPWSTR AName)

{

mName = AName;

return S_OK;

}

STDHRESULTMETHOD Say(HWND AParent)

{

wstring message = L "Hello, my friend " + mName;

MessageBox(AParent, message.c_str(), L "From C++" , MB_ICONINFORMATION);

return S_OK;

}

private :

wstring mName;

};








рдЬреИрд╕рд╛ рдХрд┐ рдЖрдк рджреЗрдЦ рд╕рдХрддреЗ рд╣реИрдВ, рд╕рдм рдХреБрдЫ рдмрд╣реБрдд рд╕рд░рд▓ рд╣реИред рд╡рд░реНрдЧ рдПрдХрд▓ IHello рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХрд╛ рд╕рдорд░реНрдерди рдХрд░рддрд╛ рд╣реИ рдФрд░ рдкреНрд░рд╛рдердорд┐рдХ рддрд░реАрдХреЛрдВ рдХреА рдПрдХ рдЬреЛрдбрд╝реА рдХреЛ рд▓рд╛рдЧреВ рдХрд░рддрд╛ рд╣реИред



рдЕрдм рдордЬрд╝реЗрджрд╛рд░ рднрд╛рдЧ рдХреЗ рд▓рд┐рдП, C # рдкреНрд░реЛрдЬреЗрдХреНрдЯ рдкрд░ рдЬрд╛рдПрдБ рдФрд░ рд▓рд┐рдЦреЗрдВ:

// enum C#

public enum EObjectType : int

{

Hello = 0,

GraphicAlgorithm

}

[InterfaceType(ComInterfaceType.InterfaceIsIUnknown),

Guid ( "08356CFE-A3DD-43c2-980C-1393E37118B2" )]

public interface IHello

{

void SetName([MarshalAs(UnmanagedType.LPWStr)] string AName);

void Say( IntPtr AParent);

}

public class Lib

{

//

[DllImport( "Lib.dll" )]

protected static extern IntPtr Create(EObjectType AType);

//

public static object CreateObject(EObjectType AType)

{

IntPtr ptr = Create(AType);

return Marshal.GetObjectForIUnknown(ptr);

}

}










рдлрд┐рд░ рд╕реЗ, рдХреБрдЫ рднреА рдЬрдЯрд┐рд▓ рдирд╣реАрдВ рд╣реИ, рд╕рд┐рд╡рд╛рдп рд╢рд╛рдпрдж рдорд╛рд░реНрд╢рд▓ рдХреЗ ред GetObjectForIUn рдкрд░рд┐рдЪрд┐рдд ред рдпрд╣ рдлрд╝рдВрдХреНрд╢рди рдХрд┐рд╕реА COM рдСрдмреНрдЬреЗрдХреНрдЯ рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддреЗ рд╣реБрдП рдПрдХ IntPtr рд▓реЗрддрд╛ рд╣реИ рдФрд░ рдЗрд╕рдХреЗ рд▓рд┐рдП рдПрдХ System.Object рджреЗрддрд╛ рд╣реИред рдЕрд▓рдЧ рд╕реЗ, рдореИрдВ рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдЖрдХрд░реНрд╖рд┐рдд рдХрд░реВрдВрдЧрд╛ рдХрд┐ IHello рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреИрд╕реЗ рдШреЛрд╖рд┐рдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ ред рдпрд╣рд╛рдВ рд╣рдо рд╕рдВрдХрд▓рдХ рдХреЛ рдмрддрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдпрд╣ рдПрдХ COM рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╣реИ, рдФрд░ рдЙрд╕реА GUID рдХреЛ C ++ рдкреНрд░реЛрдЧреНрд░рд╛рдо рдореЗрдВ рд▓рд┐рдЦреЗрдВред



рд╡рд╣ рд╕рдм рд╣реИ! рдЕрдм CHello рдХреНрд▓рд╛рд╕ рдХреЗ C ++ рддрд░реАрдХреЛрдВ рдХреЛ рдмрд┐рдирд╛ рдХрд┐рд╕реА рд╕рдорд╕реНрдпрд╛ рдХреЗ C # рд╕реЗ рдХреЙрд▓ рдХрд┐рдпрд╛ рдЬрд╛ рд╕рдХрддрд╛ рд╣реИ, рдФрд░ рдЖрдкрдХреЛ рдпрд╣ рднреА рдпрд╛рдж рдирд╣реАрдВ рд╣реИ рдХрд┐ рдЗрд╕рдХреЗ рдкреАрдЫреЗ C ++ рдХреА рдмреБрд░рд╛рдИ рдФрд░ рдбрд░рд╛рд╡рдирд╛ рд╣реИред рдЕрдкрдиреЗ рд▓рд┐рдП рджреЗрдЦреЗрдВ:



object hiObject = Lib.CreateObject(EObjectType.Hello);

IHello hello = hiObject as IHello;

hello.SetName(txtName.Text);

hello.Say(Handle);










рдЫрд╡рд┐

(рд╕рдм рдХреБрдЫ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдХрд╛рдо рдХрд░рддрд╛ рд╣реИ)



рдорд┐рд╖реНрдард╛рди рдХреЗ рд▓рд┐рдП



рдЕрдм рджреВрд╕рд░рд╛, рдмреЛрдирд╕ рд╣рд┐рд╕реНрд╕рд╛ рд╕рд░рд▓ рдЪрд┐рддреНрд░рдордп рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдХрд╛ рдПрдХ рдЬреЛрдбрд╝рд╛ рд╣реИред рдпрд╣ рдЕрдзрд┐рдХ рдпрдерд╛рд░реНрдерд╡рд╛рджреА рдЙрджрд╛рд╣рд░рдг рд╣реИред рдмрдбрд╝реА рдЫрд╡рд┐рдпреЛрдВ рдХреЛ рд╕рдВрд╕рд╛рдзрд┐рдд рдХрд░рддреЗ рд╕рдордп, рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХреЛрдб рдХреЛ C ++ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдореЗрдВ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░рдирд╛ рд╡рд╛рд╕реНрддрд╡ рдореЗрдВ рдЙрдЪрд┐рдд рд╣реИред



C ++ рдлрд╝рд╛рдЗрд▓

STDMETHODIMP CGraphicAlgorithm::QueryInterface( const CLSID &AId, void ** ARet)

{

__super::QueryInterface(AId, ARet);

if (AId == IID_IGraphicAlgorithm) *ARet = (CBaseUnknown*) this ;

return (*ARet != NULL) ? S_OK : E_NOINTERFACE;

}

STDMETHODIMP CGraphicAlgorithm::MakeGrayScale( void * APointer, int AWidth, int AHeight)

{

RGBQUAD *p = (RGBQUAD*)APointer;

for ( int y = 0; y < AHeight; y++)

{

for ( int x = 0; x < AWidth; x++)

{

// :)

short mid = (( short )p->rgbBlue + p->rgbGreen + p->rgbRed) / 3;

if (mid > 255) mid = 255;

BYTE v = (BYTE)mid;

memset(p, v, 3);

p++;

}

}

return S_OK;

}

STDMETHODIMP CGraphicAlgorithm::MakeAlpha( void * APointer, int AWidth, int AHeight)

{

RGBQUAD *p = (RGBQUAD*)APointer;

for ( int y = 0; y < AHeight; y++)

{

for ( int x = 0; x < AWidth; x++)

{

// , :)

memset(p, p->rgbReserved, 4);

p++;

}

}

return S_OK;

}








рдЬ рдлрд╛рдЗрд▓

// {65ACBBC0-45D2-4622-A779-E67ED41D2F26}

static const GUID IID_IGraphicAlgorithm =

{ 0x65acbbc0, 0x45d2, 0x4622, { 0xa7, 0x79, 0xe6, 0x7e, 0xd4, 0x1d, 0x2f, 0x26 } };

class CGraphicAlgorithm : CBaseUnknown

{

public :

STDHRESULTMETHOD MakeGrayScale( void * APointer, int AWidth, int AHeight);

STDHRESULTMETHOD MakeAlpha( void * APointer, int AWidth, int AHeight);

STDHRESULTMETHOD QueryInterface( const CLSID &AId, void ** ARet);

};










рдЕрд▓рдЧ-рдЕрд▓рдЧ, рдореИрдВ рдЗрд╕ рддрдереНрдп рдкрд░ рдЖрдкрдХрд╛ рдзреНрдпрд╛рди рдЖрдХрд░реНрд╖рд┐рдд рдХрд░рддрд╛ рд╣реВрдВ рдХрд┐ IID_IGraphicAl рдПрд▓реНрдЧреЛрд░рд┐рджрдо рд╣реИ , рд▓реЗрдХрд┐рди IGraphicAl рдПрд▓реНрдЧреЛрд░рд┐рдердо рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рд╕реНрд╡рдпрдВ , рдЬреИрд╕реЗ рдХрд┐, рдирд╣реАрдВ рд╣реИред рдРрд╕рд╛ рдХреИрд╕реЗ? рдпрд╣ рдЖрдкрдХреЗ рд╕рд╛рде рд╣рдорд╛рд░реЗ рдХрд╛рдо рдХреЛ рдФрд░ рд╕рд░рд▓ рдмрдирд╛рдиреЗ рдФрд░ рдХрдо рдХреЛрдб рд▓рд┐рдЦрдиреЗ рдХреЗ рдЙрджреНрджреЗрд╢реНрдп рд╕реЗ рдХрд┐рдпрд╛ рдЧрдпрд╛ рд╣реИред рдХреЗрд╡рд▓ рдПрдХ рдЪреАрдЬ рдЬреЛ рдпрд╣рд╛рдВ рдкрд░ рд╡рд┐рдЪрд╛рд░ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдорд╣рддреНрд╡рдкреВрд░реНрдг рд╣реИ, рд╡рд╣ рдпрд╣ рд╣реИ рдХрд┐ рд╕рднреА рд╡рд░реНрдЪреБрдЕрд▓ рддрд░реАрдХреЗ рдЬреЛ IGraphicAl рдПрд▓реНрдЧреЛрд░рд┐рджрдо рдЗрдВрдЯрд░рдлрд╝реЗрд╕ рдХреЗ рд╣реИрдВ, рдЙрдиреНрд╣реЗрдВ рдХрдХреНрд╖рд╛ рдХреА рд╢реБрд░реБрдЖрдд рдореЗрдВ рдФрд░ рд╕рдЦреНрдд рдХреНрд░рдо рдореЗрдВ рдЬрд╛рдирд╛ рдЪрд╛рд╣рд┐рдПред рдЗрд╕рдХреЗ рдЕрд▓рд╛рд╡рд╛, рддрдм рд╡рд░реНрдЧ рдХрдИ рдЕрд▓рдЧ-рдЕрд▓рдЧ рдЗрдВрдЯрд░рдлреЗрд╕ рдкреНрд░рджрд╛рди рдирд╣реАрдВ рдХрд░ рд╕рдХреЗрдЧрд╛ (рдЬрд┐рдирдХреА рд╣рдореЗрдВ рдЖрд╡рд╢реНрдпрдХрддрд╛ рдирд╣реАрдВ рд╣реИ, рдпрд╣ рдПрдХ рдФрд░ рд╡рд░реНрдЧ рдмрдирд╛рдиреЗ рдХреЗ рд▓рд┐рдП рдЕрдзрд┐рдХ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рдФрд░ рддрд╛рд░реНрдХрд┐рдХ рд╣реИ)ред



рддреЗрдЬ рдХрд░реЗрдВ рдФрд░ рдЗрд╕ рдХреЛрдб рдХреЛ рд▓рд┐рдЦреЗрдВ:

IGraphicAlgorithm utils = Lib.CreateObject(EObjectType.GraphicAlgorithm) as IGraphicAlgorithm;



BitmapData data = bmp.LockBits( new Rectangle(0, 0, bmp.Width, bmp.Height), System.Drawing.Imaging.ImageLockMode.ReadWrite, System.Drawing.Imaging.PixelFormat.Format32bppArgb);



if (optGray.Checked)

utils.MakeGrayScale(data.Scan0, data.Width, data.Height);

else

utils.MakeAlpha(data.Scan0, data.Width, data.Height);



bmp.UnlockBits(data);

picDest.Image = bmp;

picSrc.Refresh();

picDest.Refresh();








рдпрд╣рд╛рдВ, рд╣рдо рдкрд╣рд▓реЗ рдореЗрдореЛрд░реА рдХреЛ рдПрдХ рдкреЙрдЗрдВрдЯрд░ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ рдЬрд╣рд╛рдВ рдмрд┐рдЯрдореИрдк рдбреЗрдЯрд╛ рд╕рдВрдЧреНрд░рд╣реАрдд рдХрд┐рдпрд╛ рдЬрд╛рддрд╛ рд╣реИ, рдФрд░ рдлрд┐рд░ рд╣рдо рдЖрдЧреЗ рдХреА рдкреНрд░рдХреНрд░рд┐рдпрд╛ рдХреЗ рд▓рд┐рдП рдЗрд╕ рд╕реВрдЪрдХ рдХреЛ C ++ рд▓рд╛рдЗрдмреНрд░реЗрд░реА рдХреЛ рджреЗрддреЗ рд╣реИрдВред рдореИрдВ рдЖрдкрдХреЛ рддреБрд░рдВрдд рдЪреЗрддрд╛рд╡рдиреА рджреЗрддрд╛ рд╣реВрдВ рдХрд┐ рдпрд╣ рд╕рдмрд╕реЗ рдкреНрд░рднрд╛рд╡реА рдФрд░ рд╕реБрд╡рд┐рдзрд╛рдЬрдирдХ рддрд░реАрдХрд╛ рдирд╣реАрдВ рд╣реИ, рд▓реЗрдХрд┐рди рдпрджрд┐ рдЖрдк рд╡рд┐рд╖рдп рдореЗрдВ рд░реБрдЪрд┐ рд░рдЦрддреЗ рд╣реИрдВ, рддреЛ рдореИрдВ рдЖрдкрдХреЛ рдПрдХ рдЕрд▓рдЧ рд▓реЗрдЦ рдореЗрдВ рд╕реНрдореГрддрд┐ рдореЗрдВ рдЫрд╡рд┐рдпреЛрдВ рдХреЗ рд╕рд╛рде рд╕реАрдзреЗ рдХрд╛рдо рдХрд░рдиреЗ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рдмрддрд╛ рд╕рдХрддрд╛ рд╣реВрдВред



рдкрд░рд┐рдгрд╛рдорд╕реНрд╡рд░реВрдк:

рдЫрд╡рд┐



рдкрд░рд┐рдгрд╛рдо



рджреЗрдЦреЗрдВ рд╣рдореЗрдВ рдХреНрдпрд╛ рдорд┐рд▓рд╛:

PS рдкреВрд░реНрдг рд╕реНрд░реЛрдд рдХреЛрдб рдпрд╣рд╛рдВ рдбрд╛рдЙрдирд▓реЛрдб рдХрд┐рдП рдЬрд╛ рд╕рдХрддреЗ рд╣реИрдВ: http://66bit.ru/files/paper/net2c/net2c.zip

PPS рдЕрдЧрд▓рд╛ рд▓реЗрдЦ рдЙрд▓рдЯрд╛ рд╕рдорд╕реНрдпрд╛ рдХреЗ рдмрд╛рд░реЗ рдореЗрдВ рд╣реЛрдЧрд╛ - C ++ рдореЗрдВ C # рдкреБрд╕реНрддрдХрд╛рд▓рдпреЛрдВ рдХрд╛ рдкреНрд░рддреНрдпрдХреНрд╖ рдЙрдкрдпреЛрдЧ



рдпреБрдкреАрдбреАред рднрд╛рдЧ рджреЛ рдХрд╛ рд╡рд┐рдореЛрдЪрди



All Articles