المكتبه msftedit.dll عندما يتم تحميلها تقوم بعمل تسجيل لـ window class بإسم RichEdit50W و التى هى احدث اصدار من الأداه RichEdit.
حاولت صنع مثال صغير يقوم بتسجيل Window class من خلال dll فتمت العمليه دون مشاكل و لكن عند استخدام اسم الـ Window class من داخل الـ Process الرئيسى لا يتعرف عليها.
داخل وائق الـ MSDN وجدت ان الـ window class حتى يتم التعامل معها من خلال الـ Process الرئيسى لابد و ان يكون الـ style الخاص بها يحتوى على CS_GLOBALCLASS و لكن و مع استخدمها لم يتم التعرف عليها.
التالى هو مثال الـ DLL
#include <windows.h>
HMODULE hCurModule;
LRESULT CALLBACK CtrlWndProc( HWND, UINT, WPARAM, LPARAM );
VOID RegisterGClass(HMODULE hModule);
BOOL APIENTRY DllMain( HMODULE hModule, DWORD fdwReason, LPVOID lpReserved )
{
switch (fdwReason)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
RegisterGClass(hModule);
break;
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
UnregisterClass(L"MyTextEdit", hModule);
break;
}
return TRUE;
}
LRESULT CALLBACK CtrlWndProc( HWND hWnd, UINT uMsg, WPARAM wParam, LPARAM lParam )
{
switch(uMsg)
{
case WM_CREATE:
CreateCaret(hWnd,(HBITMAP)NULL, 1, 4);
break;
case WM_SETFOCUS:
ShowCaret(hWnd);
break;
case WM_KILLFOCUS:
DestroyCaret();
break;
default:
return DefWindowProc(hWnd, uMsg, wParam, lParam);
break;
};
}
VOID RegisterGClass(HMODULE hModule)
{
WNDCLASS wc;
wc.hInstance = hModule;
wc.lpszClassName = L"MyTextEdit";
wc.style = CS_DBLCLKS || CS_GLOBALCLASS;
wc.lpfnWndProc = CtrlWndProc;
wc.hCursor = (HCURSOR) LoadCursor(hModule,IDC_IBEAM);
wc.hbrBackground = (HBRUSH)COLOR_BTNFACE;
wc.cbClsExtra = NULL;
wc.cbWndExtra = NULL;
wc.hIcon = NULL;
wc.lpszMenuName = NULL;
hCurModule = hModule;
RegisterClass(&wc);
}بالنسبه للبرنامج الذى يتم تحميل الـ dll من خلاله فهو مصنوع بالـ VB.Net و شكله كالتالى
Public Class myctl
Inherits Control
Private Declare Function LoadLibrary Lib "kernel32.dll" Alias "LoadLibraryA" (ByVal lpLibFileName As String) As IntPtr
Protected Overrides ReadOnly Property CreateParams() As System.Windows.Forms.CreateParams
Get
Dim ptr As IntPtr = LoadLibrary("testCtl.dll")
Dim cp As CreateParams = MyBase.CreateParams
cp.ClassName = "MyTextEdit"
Return cp
End Get
End Property
End Classو داخل الـ Form_Load استخدم الكود التالى لتجربة الـ WindowClass
Class Form1 Inherits Form Overrides Sub OnLoad(ByVal e As EventArgs) Dim c As New MyCtrl Me.Controls.Add(C) End Sub End Class
عند تشغيل البرنامج يظهر استثناء و الرساله الخاصه به هى "Window class name is not valid."
و الله ولى التوفيق