Informasi dan Manajemen Aplikasi
Saat menulis aplikasi, Anda membuat satu CWinApp
objek turunan. Terkadang, Anda mungkin ingin mendapatkan informasi tentang objek ini dari luar CWinApp
objek -turunan. Atau Anda mungkin memerlukan akses ke objek "manajer" global lainnya.
Pustaka Kelas Microsoft Foundation menyediakan fungsi global berikut untuk membantu Anda menyelesaikan tugas-tugas ini:
Fungsi Informasi dan Manajemen Aplikasi
Nama | Deskripsi |
---|---|
AfxBeginThread |
Membuat utas baru. |
AfxContextMenuManager |
Arahkan ke manajer menu konteks global. |
AfxEndThread |
Mengakhiri utas saat ini. |
AfxFindResourceHandle |
Memanjakan rantai sumber daya dan menemukan sumber daya tertentu berdasarkan ID sumber daya dan jenis sumber daya. |
AfxFreeLibrary |
Mengurangi jumlah referensi modul pustaka tautan dinamis (DLL) yang dimuat. Ketika jumlah referensi mencapai nol, modul tidak dipetakan. |
AfxGetApp |
Mengembalikan penunjuk ke objek tunggal CWinApp aplikasi. |
AfxGetAppName |
Mengembalikan string yang berisi nama aplikasi. |
AfxGetInstanceHandle |
Mengembalikan yang HINSTANCE mewakili instans aplikasi ini. |
AfxGetMainWnd |
Mengembalikan penunjuk ke jendela "utama" saat ini dari aplikasi non-OLE, atau jendela bingkai di tempat aplikasi server. |
AfxGetPerUserRegistration |
Gunakan fungsi ini untuk menentukan apakah aplikasi mengalihkan akses registri ke HKEY_CURRENT_USER simpul (HKCU ). |
AfxGetResourceHandle |
Mengembalikan HINSTANCE ke sumber sumber daya default aplikasi. Gunakan untuk mengakses sumber daya aplikasi secara langsung. |
AfxGetThread |
Mengambil penunjuk ke objek CWinThread saat ini. |
AfxInitRichEdit |
Menginisialisasi kontrol edit kaya versi 1.0 untuk aplikasi. |
AfxInitRichEdit2 |
Menginisialisasi kontrol edit kaya versi 2.0 dan yang lebih baru untuk aplikasi. |
AfxIsExtendedFrameClass |
Menentukan apakah jendela yang diberikan adalah objek bingkai yang diperluas. |
AfxIsMFCToolBar |
Menentukan apakah jendela yang diberikan adalah objek bilah alat. |
AfxKeyboardManager |
Arahkan ke manajer keyboard global. |
AfxLoadLibrary |
Memetakan modul DLL dan mengembalikan handel yang dapat digunakan untuk mendapatkan alamat fungsi DLL. |
AfxLoadLibraryEx |
Memetakan modul DLL menggunakan opsi yang ditentukan, dan mengembalikan handel yang dapat digunakan untuk mendapatkan alamat fungsi DLL. |
AfxMenuTearOffManager |
Arahkan ke manajer menu tear-off global. |
AfxMouseManager |
Arahkan ke manajer mouse global. |
AfxRegisterClass |
Mendaftarkan kelas jendela di DLL yang menggunakan MFC. |
AfxRegisterWndClass |
Mendaftarkan kelas jendela Windows untuk melengkapi kelas yang terdaftar secara otomatis oleh MFC. |
AfxSetPerUserRegistration |
Mengatur apakah aplikasi mengalihkan akses registri ke HKEY_CURRENT_USER simpul (HKCU ). |
AfxSetResourceHandle |
Mengatur handel HINSTANCE tempat sumber daya default aplikasi dimuat. |
AfxShellManager |
Arahkan ke manajer shell global. |
AfxSocketInit |
Dipanggil dalam CWinApp::InitInstance penimpaan untuk menginisialisasi Windows Sockets. |
AfxUserToolsManager |
Arahkan ke manajer alat pengguna global. |
AfxWinInit |
Dipanggil oleh fungsi yang disediakan WinMain MFC, sebagai bagian CWinApp dari inisialisasi aplikasi berbasis GUI, untuk menginisialisasi MFC. Harus dipanggil langsung untuk aplikasi konsol yang menggunakan MFC. |
AfxBeginThread
Panggil fungsi ini untuk membuat utas baru.
CWinThread* AfxBeginThread(
AFX_THREADPROC pfnThreadProc,
LPVOID pParam,
int nPriority = THREAD_PRIORITY_NORMAL,
UINT nStackSize = 0,
DWORD dwCreateFlags = 0,
LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL);
CWinThread* AfxBeginThread(
CRuntimeClass* pThreadClass,
int nPriority = THREAD_PRIORITY_NORMAL,
UINT nStackSize = 0,
DWORD dwCreateFlags = 0,
LPSECURITY_ATTRIBUTES lpSecurityAttrs = NULL);
Parameter
pfnThreadProc
Menunjuk ke fungsi pengontrol untuk utas pekerja. Penunjuk tidak boleh NULL
. Fungsi ini harus dideklarasikan sebagai berikut:
UINT __cdecl MyControllingFunction( LPVOID pParam );
pThreadClass
Dari RUNTIME_CLASS
objek yang berasal dari CWinThread
.
pParam
Parameter untuk diteruskan ke fungsi pengontrol.
nPriority
Prioritas yang akan diatur untuk utas. Untuk daftar lengkap dan deskripsi prioritas yang tersedia, lihat SetThreadPriority
di Windows SDK.
nStackSize
Menentukan ukuran dalam byte tumpukan untuk utas baru. Jika 0, ukuran tumpukan default ke tumpukan ukuran yang sama dengan alur pembuatan.
dwCreateFlags
Menentukan bendera tambahan yang mengontrol pembuatan utas. Bendera ini dapat berisi salah satu dari dua nilai:
CREATE_SUSPENDED
Mulai utas dengan jumlah yang ditangguhkan. GunakanCREATE_SUSPENDED
jika Anda ingin menginisialisasi dataCWinThread
anggota objek apa pun, sepertim_bAutoDelete
atau anggota kelas turunan Anda, sebelum utas mulai berjalan. Setelah inisialisasi Anda selesai, gunakanCWinThread::ResumeThread
untuk memulai utas yang berjalan. Utas tidak akan dijalankan sampaiCWinThread::ResumeThread
dipanggil.0 Mulai utas segera setelah pembuatan.
lpSecurityAttrs
Menunjuk ke SECURITY_ATTRIBUTES
struktur yang menentukan atribut keamanan untuk utas. Jika NULL
, atribut keamanan yang sama dengan alur pembuatan digunakan. Untuk informasi selengkapnya tentang struktur ini, lihat Windows SDK.
Tampilkan Nilai
Arahkan ke objek utas yang baru dibuat, atau NULL
jika terjadi kegagalan.
Keterangan
Bentuk pertama dari AfxBeginThread
membuat utas pekerja. Formulir kedua membuat utas yang dapat berfungsi sebagai utas antarmuka pengguna atau sebagai utas pekerja.
AfxBeginThread
membuat objek baru CWinThread
, memanggil fungsinya CreateThread
untuk mulai menjalankan utas, dan mengembalikan penunjuk ke utas. Pemeriksaan dilakukan di seluruh prosedur untuk memastikan semua objek dibatalkan alokasinya dengan benar jika bagian mana pun dari pembuatan gagal. Untuk mengakhiri utas, panggil AfxEndThread
dari dalam utas, atau kembali dari fungsi pengontrol utas pekerja.
Multithreading harus diaktifkan oleh aplikasi; jika tidak, fungsi ini akan gagal. Untuk informasi selengkapnya tentang mengaktifkan multithreading, lihat /MD
, , /MT
/LD
(Gunakan pustaka run-time).
Untuk informasi selengkapnya tentang AfxBeginThread
, lihat artikel Multithreading: Membuat Utas Pekerja dan Multithreading: Membuat Utas Antarmuka Pengguna.
Contoh
Lihat contoh untuk CSocket::Attach
.
Persyaratan
Header afxwin.h
AfxContextMenuManager
Arahkan ke manajer menu konteks global.
Sintaks
CContextMenuManager* afxContextMenuManager;
Persyaratan
Header: afxcontextmenumanager.h
AfxEndThread
Panggil fungsi ini untuk mengakhiri utas yang sedang dijalankan.
void AFXAPI AfxEndThread(
UINT nExitCode,
BOOL bDelete = TRUE);
Parameter
nExitCode
Menentukan kode keluar utas.
bDelete
Menghapus objek utas dari memori.
Keterangan
Harus dipanggil dari dalam utas untuk dihentikan.
Untuk informasi selengkapnya tentang AfxEndThread
, lihat artikel Multithreading: Mengakhiri Utas.
Persyaratan
Header afxwin.h
AfxFindResourceHandle
Gunakan AfxFindResourceHandle
untuk memanjakan rantai sumber daya dan menemukan sumber daya tertentu berdasarkan ID sumber daya dan jenis sumber daya.
Sintaks
HINSTANCE AFXAPI AfxFindResourceHandle( LPCTSTR lpszName, LPCTSTR lpszType );
Parameter
lpszName
Penunjuk ke string yang berisi ID sumber daya.
lpszType
Penunjuk ke jenis sumber daya. Untuk daftar jenis sumber daya, lihat FindResource
di Windows SDK.
Tampilkan Nilai
Handel ke modul yang berisi sumber daya.
Keterangan
AfxFindResourceHandle
menemukan sumber daya tertentu, dan mengembalikan handel ke modul yang berisi sumber daya. Sumber daya mungkin berada di DLL ekstensi MFC apa pun yang dimuat. AfxFindResourceHandle
memberi tahu Anda mana yang memiliki sumber daya.
Modul dicari dalam urutan ini:
Modul utama, jika itu adalah DLL ekstensi MFC.
Modul non-sistem.
Modul khusus bahasa.
Modul utama, jika itu adalah DLL sistem.
Modul sistem.
Persyaratan
Header: afxwin.h
AfxFreeLibrary
Baik AfxFreeLibrary
dan AfxLoadLibrary
pertahankan jumlah referensi untuk setiap modul pustaka yang dimuat.
BOOL AFXAPI AfxFreeLibrary(HINSTANCE hInstLib);
Parameter
hInstLib
Handel modul pustaka yang dimuat. AfxLoadLibrary
mengembalikan handel ini.
Tampilkan Nilai
TRUE
jika fungsi berhasil; jika tidak, FALSE
.
Keterangan
AfxFreeLibrary
mengurangi jumlah referensi modul pustaka tautan dinamis (DLL) yang dimuat. Ketika jumlah referensi mencapai nol, modul tidak dipetakan dari ruang alamat proses panggilan dan handel tidak lagi valid. Jumlah referensi ini bertambah setiap kali AfxLoadLibrary
dipanggil.
Sebelum membatalkan pembukaan modul pustaka, sistem memungkinkan DLL untuk melepaskan dari proses menggunakannya. Melakukannya memberi DLL kesempatan untuk membersihkan sumber daya yang dialokasikan untuk proses saat ini. Setelah fungsi titik entri kembali, modul pustaka dihapus dari ruang alamat proses saat ini.
Gunakan AfxLoadLibrary
untuk memetakan modul DLL.
Pastikan untuk menggunakan AfxFreeLibrary
dan AfxLoadLibrary
(alih-alih fungsi FreeLibrary
Win32 dan LoadLibrary
) jika aplikasi Anda menggunakan beberapa utas. Menggunakan AfxLoadLibrary
dan AfxFreeLibrary
memastikan bahwa kode startup dan shutdown yang dijalankan saat DLL ekstensi MFC dimuat dan dibongkar tidak merusak status MFC global.
Contoh
Lihat contoh untuk AfxLoadLibrary
.
Persyaratan
Header afxdll_.h
AfxGetApp
Pointer yang dikembalikan oleh fungsi ini dapat digunakan untuk mengakses informasi aplikasi seperti kode pengiriman pesan utama atau jendela paling atas.
CWinApp* AFXAPI AfxGetApp();
Tampilkan Nilai
Penunjuk ke objek tunggal CWinApp
untuk aplikasi.
Keterangan
Jika metode ini mengembalikan NULL
, mungkin menunjukkan bahwa jendela utama aplikasi belum sepenuhnya diinisialisasi. Ini mungkin juga menunjukkan masalah.
Contoh
// Print the application's executable filename.
TRACE(_T("Executable filename = %s\n"), AfxGetApp()->m_pszExeName);
Persyaratan
Header afxwin.h
AfxGetAppName
String yang dikembalikan dapat digunakan untuk pesan diagnostik, atau sebagai akar untuk nama string sementara.
LPCTSTR AFXAPI AfxGetAppName();
Tampilkan Nilai
String null-terminated yang berisi nama aplikasi.
Contoh
// Print the application name to the debugger output window.
TRACE(_T("Application name is %s\n"), AfxGetAppName());
Persyaratan
Header afxwin.h
AfxGetInstanceHandle
Fungsi ini memungkinkan Anda untuk mengambil handel instans aplikasi saat ini.
HINSTANCE AFXAPI AfxGetInstanceHandle();
Tampilkan Nilai
Ke HINSTANCE
instans aplikasi saat ini. Jika dipanggil dari dalam DLL yang ditautkan dengan MFC versi USRDLL, HINSTANCE
dll akan dikembalikan.
Keterangan
AfxGetInstanceHandle
selalu mengembalikan HINSTANCE
file yang dapat dieksekusi (.EXE) kecuali dipanggil dari dalam DLL yang ditautkan dengan MFC versi USRDLL. Dalam hal ini, ia mengembalikan HINSTANCE
ke DLL.
Contoh
// Print the application instance handle to the debugger output window.
TRACE(_T("Application instance handle is 0x%0X\n"), AfxGetInstanceHandle());
Persyaratan
Header afxwin.h
AfxGetMainWnd
Jika aplikasi Anda adalah server OLE, panggil fungsi ini untuk mengambil penunjuk ke jendela utama aktif aplikasi. Gunakan hasil ini alih-alih langsung merujuk ke m_pMainWnd
anggota objek aplikasi.
CWnd* AFXAPI AfxGetMainWnd();
Tampilkan Nilai
Mengembalikan penunjuk ke objek jendela bingkai yang berisi dokumen aktif di tempat, jika server memiliki objek yang aktif di tempat di dalam kontainer aktif.
Jika tidak ada objek yang aktif di tempat dalam kontainer, atau aplikasi Anda bukan server OLE, fungsi ini mengembalikan m_pMainWnd
objek aplikasi Anda.
Jika AfxGetMainWnd
dipanggil dari utas utama aplikasi, aplikasi mengembalikan jendela utama aplikasi sesuai dengan aturan di atas. Jika fungsi dipanggil dari utas sekunder dalam aplikasi, fungsi mengembalikan jendela utama yang terkait dengan utas yang melakukan panggilan.
Keterangan
Jika aplikasi Anda bukan server OLE, maka memanggil fungsi ini setara dengan langsung merujuk ke m_pMainWnd
anggota objek aplikasi Anda.
Contoh
//The following line send a WM_CLOSE message
// to the Application's main window. This will cause the
// Application to exit.
AfxGetMainWnd()->PostMessage(WM_CLOSE, 0, 0);
Persyaratan
Header afxwin.h
AfxGetPerUserRegistration
Gunakan fungsi ini untuk menentukan apakah aplikasi mengalihkan akses registri ke HKEY_CURRENT_USER
simpul (HKCU
).
BOOL AFXAPI AfxGetPerUserRegistration();
Tampilkan Nilai
TRUE
menunjukkan informasi registri diarahkan ke simpul HKCU
. FALSE
menunjukkan aplikasi menulis informasi registri ke simpul default. Simpul default adalah HKEY_CLASSES_ROOT
(HKCR
).
Keterangan
Jika Anda mengaktifkan pengalihan registri, kerangka kerja mengalihkan akses dari HKCR
ke HKEY_CURRENT_USER\Software\Classes
. Hanya kerangka kerja MFC dan ATL yang dipengaruhi oleh pengalihan.
Untuk mengubah apakah aplikasi mengalihkan akses registri, gunakan AfxSetPerUserRegistration
.
Persyaratan
Header afxstat_.h
AfxGetResourceHandle
Gunakan handel yang HINSTANCE
dikembalikan oleh fungsi ini untuk mengakses sumber daya aplikasi secara langsung, misalnya, dalam panggilan ke fungsi FindResource
Windows .
extern HINSTANCE AfxGetResourceHandle();
Tampilkan Nilai
Handel HINSTANCE
tempat sumber daya default aplikasi dimuat.
Contoh
//Load the menu specifying the module handle where resource is to be
//found & resource ID
HMENU hMenu = ::LoadMenu(AfxGetResourceHandle(), MAKEINTRESOURCE(IDR_MAINFRAME));
Persyaratan
Header afxwin.h
AfxGetThread
Panggil fungsi ini untuk mendapatkan penunjuk ke objek yang CWinThread
mewakili utas yang sedang dijalankan.
CWinThread* AfxGetThread();
Tampilkan Nilai
Penunjuk ke utas yang sedang dijalankan; jika tidak NULL
.
Keterangan
Harus dipanggil dari dalam utas.
Catatan
Jika Anda mentransfer panggilan AfxGetThread
proyek MFC dari Visual C++ versi 4.2, 5.0, atau 6.0, AfxGetThread
panggilan jika tidak ada utas AfxGetApp
yang ditemukan. Dalam versi pengkompilasi yang lebih baru, AfxGetThread
mengembalikan jika tidak ada utas NULL
yang ditemukan. Jika Anda menginginkan utas aplikasi, Anda harus memanggil AfxGetApp
.
Contoh
//Print the current thread ID in the Debug Window
TRACE(_T("Current Thread ID = 0x%X\n"), AfxGetThread()->m_nThreadID);
Persyaratan
Header afxwin.h
AfxInitRichEdit
Panggil fungsi ini untuk menginisialisasi kontrol edit kaya (versi 1.0) untuk aplikasi.
BOOL AFXAPI AfxInitRichEdit();
Keterangan
Fungsi ini disediakan untuk kompatibilitas mundur. Aplikasi baru harus menggunakan AfxInitRichEdit2
.
AfxInitRichEdit
RICHED32.DLL
memuat untuk menginisialisasi kontrol edit kaya versi 1.0. Untuk menggunakan kontrol edit kaya versi 2.0 dan 3.0, RICHED20.DLL
perlu dimuat. Ini dimuat dengan melakukan panggilan ke AfxInitRichEdit2
.
Untuk memperbarui kontrol edit kaya di aplikasi Visual C++ yang ada ke versi 2.0, buka . File RC sebagai teks, ubah nama kelas setiap kontrol edit kaya dari "RICHEDIT
" menjadi "RichEdit20a
". Kemudian ganti panggilan ke AfxInitRichEdit
dengan AfxInitRichEdit2
.
Fungsi ini juga menginisialisasi pustaka kontrol umum, jika pustaka belum diinisialisasi untuk proses tersebut. Jika Anda menggunakan kontrol edit kaya langsung dari aplikasi MFC Anda, panggil fungsi ini untuk memastikan bahwa MFC telah menginisialisasi runtime kontrol edit yang kaya dengan benar. Jika Anda memanggil Create
metode CRichEditCtrl
, , CRichEditView
atau CRichEditDoc
, Anda biasanya tidak perlu memanggil fungsi ini, tetapi dalam beberapa kasus mungkin diperlukan.
Persyaratan
Header afxwin.h
AfxInitRichEdit2
Panggil fungsi ini untuk menginisialisasi kontrol edit kaya (versi 2.0 dan yang lebih baru) untuk aplikasi.
BOOL AFXAPI AfxInitRichEdit2();
Keterangan
Panggil fungsi ini untuk memuat RICHED20.DLL
dan menginisialisasi versi 2.0 dari kontrol edit kaya. Jika Anda memanggil Create
metode CRichEditCtrl
, , CRichEditView
atau CRichEditDoc
, Anda biasanya tidak perlu memanggil fungsi ini, tetapi dalam beberapa kasus mungkin diperlukan.
Persyaratan
Header afxwin.h
AfxIsExtendedFrameClass
Menentukan apakah jendela yang diberikan adalah objek bingkai yang diperluas.
Sintaks
BOOL AFXAPI AfxIsExtendedFrameClass( CWnd* pWnd );
Parameter
pWnd
[di] Penunjuk ke objek yang berasal dari CWnd
.
Tampilkan Nilai
TRUE
jika jendela yang disediakan adalah objek bingkai yang diperluas; jika tidak FALSE
.
Keterangan
Metode ini mengembalikan TRUE
jika pWnd
berasal dari salah satu kelas berikut:
CFrameWndEx
CMDIFrameWndEx
COleIPFrameWndEx
COleDocIPFrameWndEx
CMDIChildWndEx
Metode ini berguna ketika Anda harus memvalidasi bahwa parameter fungsi atau metode adalah jendela bingkai yang diperluas.
Persyaratan
Header: afxpriv.h
AfxIsMFCToolBar
Menentukan apakah jendela yang diberikan adalah objek bilah alat.
Sintaks
BOOL AFXAPI AfxIsMFCToolBar(CWnd* pWnd);
Parameter
pWnd
[di] Penunjuk ke objek yang berasal dari CWnd
.
Tampilkan Nilai
TRUE
jika jendela yang disediakan adalah objek toolbar; jika tidak FALSE
.
Keterangan
Metode ini mengembalikan TRUE
jika pWnd
berasal dari CMFCToolBar
. Metode ini berguna ketika Anda harus memvalidasi bahwa parameter fungsi atau metode adalah CMFCToolBar
objek.
Persyaratan
Header: afxpriv.h
AfxKeyboardManager
Arahkan ke manajer keyboard global.
Sintaks
CKeyboardManager* afxKeyboardManager;
Persyaratan
Header: afxkeyboardmanager.h
AfxLoadLibrary
Gunakan AfxLoadLibrary
untuk memetakan modul DLL.
HINSTANCE AFXAPI AfxLoadLibrary(LPCTSTR lpszModuleName);
Parameter
lpszModuleName
Menunjuk ke string null-terminated yang berisi nama modul (baik file .DLL atau .EXE). Nama yang ditentukan adalah nama file modul.
Jika string menentukan jalur tetapi file tidak ada di direktori yang ditentukan, fungsi gagal.
Jika jalur tidak ditentukan dan ekstensi nama file dihilangkan, ekstensi default .DLL ditambahkan. Namun, string nama file dapat menyertakan karakter titik berikutnya (.) untuk menunjukkan bahwa nama modul tidak memiliki ekstensi. Ketika tidak ada jalur yang ditentukan, fungsi menggunakan Urutan Pencarian untuk Aplikasi Desktop.
Tampilkan Nilai
Jika fungsi berhasil, nilai pengembalian adalah handel ke modul. Jika gagal, nilai yang dikembalikan adalah NULL
.
Keterangan
Ini mengembalikan handel yang dapat digunakan GetProcAddress
untuk mendapatkan alamat fungsi DLL. AfxLoadLibrary
juga dapat digunakan untuk memetakan modul lain yang dapat dieksekusi.
Setiap proses mempertahankan jumlah referensi untuk setiap modul pustaka yang dimuat. Jumlah referensi ini bertambah setiap kali AfxLoadLibrary
dipanggil dan dikurangi setiap kali AfxFreeLibrary
dipanggil. Ketika jumlah referensi mencapai nol, modul tidak dipetakan dari ruang alamat proses panggilan dan handel tidak lagi valid.
Pastikan untuk menggunakan AfxLoadLibrary
dan AfxFreeLibrary
(alih-alih fungsi LoadLibrary
Win32 dan FreeLibrary
) jika aplikasi Anda menggunakan beberapa utas, dan jika secara dinamis memuat DLL ekstensi MFC. Menggunakan AfxLoadLibrary
dan AfxFreeLibrary
memastikan bahwa kode startup dan shutdown yang dijalankan ketika DLL ekstensi MFC dimuat dan dibongkar tidak merusak status MFC global.
Menggunakan AfxLoadLibrary
dalam aplikasi mengharuskan Anda untuk secara dinamis menautkan ke MFC versi DLL. File header untuk AfxLoadLibrary
, Afxdll_.h
, hanya disertakan jika MFC ditautkan ke aplikasi sebagai DLL. Persyaratan ini dirancang, karena Anda harus menautkan ke versi DLL MFC untuk menggunakan atau membuat DLL ekstensi MFC.
Contoh
// The following shows how to create a MDI based application
// using a generic CView derived class that is implemented in
// a dynamically loaded MFC Extension DLL.
typedef CRuntimeClass *(*GETDLLVIEW)();
BOOL CUserApp::InitInstance()
{
// Standard Application Wizard generated initialization excluded.
// Register the application's document templates. Document templates
// serve as the connection between documents, frame windows and views
//Load MFC Extension DLL based view class.
m_hViewDll = AfxLoadLibrary(szMyViewDllPath);
if (!m_hViewDll)
{
CString str;
str.Format(_T("Error: Cannot find component %s"), szMyViewDllPath);
AfxMessageBox(str);
return FALSE;
}
GETDLLVIEW GetMyView = (GETDLLVIEW)GetProcAddress(m_hViewDll, "GetMyView");
ASSERT(GetMyView != NULL);
CMultiDocTemplate *pDocTemplate;
pDocTemplate = new CMultiDocTemplate(IDR_NVC_MFC_DLLUserTYPE,
RUNTIME_CLASS(CUserDoc),
RUNTIME_CLASS(CChildFrame), // custom MDI child frame
GetMyView());
if (!pDocTemplate)
return FALSE;
AddDocTemplate(pDocTemplate);
// Standard Application Wizard generated initialization excluded.
return TRUE;
}
int CUserApp::ExitInstance()
{
if (NULL != m_hViewDll)
{
AfxFreeLibrary(m_hViewDll);
m_hViewDll = NULL;
}
return CWinApp::ExitInstance();
}
Persyaratan
Header afxdll_.h
AfxLoadLibraryEx
Gunakan AfxLoadLibraryEx
untuk memetakan modul DLL.
HINSTANCE AFXAPI AfxLoadLibraryEx(LPCTSTR lpFileName, HANDLE hFile, DWORD dwFlags);
Parameter
lpFileName
Menunjuk ke string null-terminated yang berisi nama modul (baik file .DLL atau .EXE). Nama yang ditentukan adalah nama file modul.
Jika string menentukan jalur tetapi file tidak ada di direktori yang ditentukan, fungsi gagal.
Jika jalur tidak ditentukan dan ekstensi nama file dihilangkan, ekstensi default .DLL ditambahkan. Namun, string nama file dapat menyertakan karakter titik berikutnya (.) untuk menunjukkan bahwa nama modul tidak memiliki ekstensi. Ketika tidak ada jalur yang ditentukan, fungsi menggunakan Urutan Pencarian untuk Aplikasi Desktop.
hFile
Parameter ini dicadangkan untuk digunakan di masa mendatang. Harus .NULL
dwFlags
Tindakan yang akan diambil saat memuat modul. Jika tidak ada bendera yang ditentukan, perilaku fungsi ini identik dengan AfxLoadLibrary
fungsi . Nilai yang mungkin dari parameter ini dijelaskan dalam LoadLibraryEx
dokumentasi.
Tampilkan Nilai
Jika fungsi berhasil, nilai pengembalian adalah handel ke modul. Jika gagal, nilai yang dikembalikan adalah NULL
.
Keterangan
AfxLoadLibraryEx
mengembalikan handel yang dapat digunakan GetProcAddress
untuk mendapatkan alamat fungsi DLL. AfxLoadLibraryEx
juga dapat digunakan untuk memetakan modul lain yang dapat dieksekusi.
Setiap proses mempertahankan jumlah referensi untuk setiap modul pustaka yang dimuat. Jumlah referensi ini bertambah setiap kali AfxLoadLibraryEx
dipanggil dan dikurangi setiap kali AfxFreeLibrary
dipanggil. Ketika jumlah referensi mencapai nol, modul tidak dipetakan dari ruang alamat proses panggilan dan handel tidak lagi valid.
Pastikan untuk menggunakan AfxLoadLibraryEx
dan AfxFreeLibrary
(alih-alih fungsi LoadLibraryEx
Win32 dan FreeLibrary
) jika aplikasi Anda menggunakan beberapa utas dan jika secara dinamis memuat DLL ekstensi MFC. Menggunakan AfxLoadLibraryEx
dan AfxFreeLibrary
memastikan bahwa kode startup dan shutdown yang dijalankan saat DLL ekstensi MFC dimuat dan dibongkar tidak merusak status MFC global.
Menggunakan AfxLoadLibraryEx
dalam aplikasi mengharuskan Anda untuk secara dinamis menautkan ke MFC versi DLL. File header untuk AfxLoadLibraryEx
, Afxdll_.h
, hanya disertakan jika MFC ditautkan ke aplikasi sebagai DLL. Persyaratan ini dirancang, karena Anda harus menautkan ke versi DLL MFC untuk menggunakan atau membuat DLL ekstensi MFC.
Persyaratan
Header afxdll_.h
AfxMenuTearOffManager
Arahkan ke manajer menu tear-off global.
Sintaks
CMenuTearOffManager* g_pTearOffMenuManager;
Persyaratan
Header: afxmenutearoffmanager.h
AfxMouseManager
Arahkan ke manajer mouse global.
Sintaks
CMouseManager* afxMouseManager;
Persyaratan
Header: afxmousemanager.h
AfxRegisterClass
Gunakan fungsi ini untuk mendaftarkan kelas jendela di DLL yang menggunakan MFC.
BOOL AFXAPI AfxRegisterClass(WNDCLASS* lpWndClass);
Parameter
lpWndClass
Penunjuk ke struktur yang WNDCLASS
berisi informasi tentang kelas jendela yang akan didaftarkan. Untuk informasi selengkapnya tentang struktur ini, lihat Windows SDK.
Tampilkan Nilai
TRUE
jika kelas berhasil didaftarkan; jika tidak FALSE
.
Keterangan
Jika Anda menggunakan fungsi ini, kelas secara otomatis tidak terdaftar saat DLL dibongkar.
Dalam build non-DLL, AfxRegisterClass
pengidentifikasi didefinisikan sebagai makro yang memetakan ke fungsi RegisterClass
Windows , karena kelas yang terdaftar dalam aplikasi secara otomatis tidak terdaftar. Jika Anda menggunakan AfxRegisterClass
alih-alih RegisterClass
, kode Anda dapat digunakan tanpa mengubah baik dalam aplikasi maupun di DLL.
Contoh
// Register your unique class name that you wish to use
WNDCLASS wndcls;
memset(&wndcls, 0, sizeof(WNDCLASS)); // start with NULL defaults
wndcls.style = CS_DBLCLKS | CS_HREDRAW | CS_VREDRAW;
//you can specify your own window procedure
wndcls.lpfnWndProc = ::DefWindowProc;
wndcls.hInstance = AfxGetInstanceHandle();
wndcls.hIcon = LoadIcon(wndcls.hInstance, MAKEINTRESOURCE(IDI_MYICON));
wndcls.hCursor = LoadCursor(wndcls.hInstance, MAKEINTRESOURCE(IDC_ARROW));
wndcls.hbrBackground = (HBRUSH)(COLOR_WINDOW + 1);
wndcls.lpszMenuName = NULL;
// Specify your own class name for using FindWindow later
wndcls.lpszClassName = _T("MyNewClass");
// Register the new class and trace if it fails
if(!AfxRegisterClass(&wndcls))
{
TRACE("Class Registration Failed\n");
}
Persyaratan
Header afxwin.h
AfxRegisterWndClass
Memungkinkan Anda mendaftarkan kelas jendela Anda sendiri.
LPCTSTR AFXAPI AfxRegisterWndClass(
UINT nClassStyle,
HCURSOR hCursor = 0,
HBRUSH hbrBackground = 0,
HICON hIcon = 0);
Parameter
nClassStyle
Menentukan gaya kelas Windows atau kombinasi gaya, yang dibuat dengan menggunakan operator bitwise-OR (|
), untuk kelas jendela. Untuk daftar gaya kelas, lihat WNDCLASS
struktur di Windows SDK. Jika NULL
, default diatur sebagai berikut:
Mengatur gaya mouse ke
CS_DBLCLKS
, yang mengirim pesan klik ganda ke prosedur jendela saat pengguna mengklik dua kali mouse.Mengatur gaya kursor panah ke standar
IDC_ARROW
Windows .Mengatur kuas latar belakang ke
NULL
, sehingga jendela tidak akan menghapus latar belakangnya.Mengatur ikon ke ikon logo Windows standar berbendera melambaikan tangan.
hCursor
Menentukan handel ke sumber daya kursor yang akan diinstal di setiap jendela yang dibuat dari kelas jendela. Jika Anda menggunakan default 0, Anda akan mendapatkan kursor standar IDC_ARROW
.
hbrBackground
Menentukan handel ke sumber daya kuas yang akan diinstal di setiap jendela yang dibuat dari kelas jendela. Jika Anda menggunakan default 0, Anda akan memiliki NULL
kuas latar belakang, dan secara default, jendela Anda tidak akan menghapus latar belakangnya saat memproses WM_ERASEBKGND
.
hIcon
Menentukan handel ke sumber daya ikon yang akan diinstal di setiap jendela yang dibuat dari kelas jendela. Jika Anda menggunakan default 0, Anda akan mendapatkan ikon logo Windows standar berbendera melambaikan bendera.
Tampilkan Nilai
String null-terminated yang berisi nama kelas. Anda dapat meneruskan nama kelas ini ke Create
fungsi anggota di CWnd
atau **CWnd-
**kelas turunan lainnya untuk membuat jendela. Nama ini dihasilkan oleh Pustaka Kelas Microsoft Foundation.
Catatan
Nilai yang dikembalikan adalah penunjuk ke buffer statis. Untuk menyimpan string ini, tetapkan ke CString
variabel.
Keterangan
Pustaka Kelas Microsoft Foundation secara otomatis mendaftarkan beberapa kelas jendela standar untuk Anda. Panggil fungsi ini jika Anda ingin mendaftarkan kelas jendela Anda sendiri.
Nama yang terdaftar untuk kelas berdasarkan AfxRegisterWndClass
hanya bergantung pada parameter. Jika Anda memanggil AfxRegisterWndClass
beberapa kali dengan parameter yang identik, itu hanya mendaftarkan kelas pada panggilan pertama. Kemudian memanggil dengan AfxRegisterWndClass
parameter yang identik mengembalikan nama kelas yang sudah terdaftar.
Jika Anda memanggil AfxRegisterWndClass
beberapa CWnd
kelas turunan dengan parameter yang identik, alih-alih mendapatkan kelas jendela terpisah untuk setiap kelas, setiap kelas berbagi kelas jendela yang sama. Berbagi ini dapat menyebabkan masalah jika CS_CLASSDC
gaya kelas digunakan. Alih-alih beberapa CS_CLASSDC
kelas jendela, Anda hanya berakhir dengan satu CS_CLASSDC
kelas jendela. Semua jendela C++ yang menggunakan kelas tersebut memiliki DC yang sama. Untuk menghindari masalah ini, panggil AfxRegisterClass
untuk mendaftarkan kelas.
Lihat Catatan Teknis TN001: Pendaftaran Kelas Jendela untuk informasi selengkapnya tentang pendaftaran kelas jendela dan AfxRegisterWndClass
fungsi .
Contoh
CString strMyClass;
// load stock cursor, brush, and icon for
// my own window class
try
{
strMyClass = AfxRegisterWndClass(
CS_VREDRAW | CS_HREDRAW,
::LoadCursor(NULL, IDC_ARROW),
(HBRUSH)::GetStockObject(WHITE_BRUSH),
::LoadIcon(NULL, IDI_APPLICATION));
}
catch (CResourceException *pEx)
{
AfxMessageBox(_T("Couldn't register class! (Already registered?)"));
pEx->Delete();
}
Persyaratan
Header afxwin.h
AfxSetPerUserRegistration
Mengatur apakah aplikasi mengalihkan akses registri ke HKEY_CURRENT_USER
simpul (HKCU
).
void AFXAPI AfxSetPerUserRegistration(BOOL bEnable);
Parameter
bEnable
[di] TRUE
menunjukkan informasi registri diarahkan ke simpul HKCU
. FALSE
menunjukkan aplikasi menulis informasi registri ke simpul default. Simpul default adalah HKEY_CLASSES_ROOT
(HKCR
).
Keterangan
Sebelum Windows Vista, aplikasi yang mengakses registri biasanya menggunakan simpul HKEY_CLASSES_ROOT
. Namun, dengan Windows Vista atau sistem operasi yang lebih baru, Anda harus menjalankan aplikasi dalam mode yang ditingkatkan untuk menulis ke HKCR
.
Metode ini memungkinkan aplikasi Anda untuk membaca dan menulis ke registri tanpa berjalan dalam mode yang ditinggikan. Ini berfungsi dengan mengalihkan akses registri dari HKCR
ke HKCU
. Untuk informasi selengkapnya, lihat Halaman Properti Linker.
Jika Anda mengaktifkan pengalihan registri, kerangka kerja mengalihkan akses dari HKCR
ke HKEY_CURRENT_USER\Software\Classes
. Hanya kerangka kerja MFC dan ATL yang dipengaruhi oleh pengalihan.
Implementasi default mengakses registri di bawah HKCR
.
Persyaratan
Header afxstat_.h
AfxSetResourceHandle
Gunakan fungsi ini untuk mengatur HINSTANCE
handel yang menentukan tempat sumber daya default aplikasi dimuat.
void AFXAPI AfxSetResourceHandle(HINSTANCE hInstResource);
Parameter
hInstResource
Instans atau modul menangani file .EXE atau DLL tempat sumber daya aplikasi dimuat.
Contoh
// This code is taken from CMyApp::InitInstance
HINSTANCE hRes = NULL;
hRes = LoadLibrary(_T("Resource.dll"));
if (hRes)
AfxSetResourceHandle(hRes);
Persyaratan
Header afxwin.h
AfxShellManager
Arahkan ke manajer shell global.
Sintaks
CShellManager* afxShellManager;
Persyaratan
Header: afxshellmanager.h
AfxSocketInit
Panggil fungsi ini dalam penimpaan Anda CWinApp::InitInstance
untuk menginisialisasi Windows Sockets.
BOOL AfxSocketInit(WSADATA* lpwsaData = NULL);
Parameter
lpwsaData
Penunjuk ke WSADATA
struktur. Jika lpwsaData
tidak sama dengan NULL
, maka alamat struktur diisi WSADATA
oleh panggilan ke WSAStartup
. Fungsi ini juga memastikan bahwa WSACleanup
dipanggil untuk Anda sebelum aplikasi berakhir.
Tampilkan Nilai
Bukan nol jika fungsi berhasil; jika tidak, 0.
Keterangan
Saat menggunakan soket MFC di utas sekunder dalam aplikasi MFC yang ditautkan secara statis, Anda harus memanggil AfxSocketInit
di setiap utas yang menggunakan soket untuk menginisialisasi pustaka soket. Secara default, AfxSocketInit
hanya dipanggil di utas utama.
Persyaratan
Header afxsock.h
AfxUserToolsManager
Arahkan ke manajer alat pengguna global.
Sintaks
CUserToolsManager* afxUserToolsManager;
Persyaratan
Header: afxusertoolsmanager.h
AfxWinInit
Fungsi ini disebut oleh fungsi yang disediakan WinMain
MFC, sebagai bagian CWinApp
dari inisialisasi aplikasi berbasis GUI, untuk menginisialisasi MFC.
BOOL AFXAPI AfxWinInit(
HINSTANCE hInstance,
HINSTANCE hPrevInstance,
LPTSTR lpCmdLine,
int nCmdShow);
Parameter
hInstance
Handel modul yang sedang berjalan.
hPrevInstance
Handel ke instans aplikasi sebelumnya. Untuk aplikasi berbasis Win32, parameter ini selalu NULL
.
lpCmdLine
Menunjuk ke string null-terminated yang menentukan baris perintah untuk aplikasi.
nCmdShow
Menentukan bagaimana jendela utama aplikasi GUI akan ditampilkan.
Keterangan
Untuk aplikasi konsol, yang tidak menggunakan fungsi yang disediakan WinMain
MFC, Anda harus memanggil AfxWinInit
langsung untuk menginisialisasi MFC.
Jika Anda memanggil AfxWinInit
diri Anda sendiri, Anda harus mendeklarasikan instans CWinApp
kelas. Untuk aplikasi konsol, Anda dapat memilih untuk tidak memperoleh kelas Anda sendiri dan CWinApp
sebaliknya menggunakan instans secara CWinApp
langsung. Teknik ini sesuai jika Anda memutuskan untuk meninggalkan semua fungsionalitas untuk aplikasi Anda dalam implementasi Anda .main
Catatan
Saat membuat konteks aktivasi untuk perakitan, MFC menggunakan sumber daya manifes yang disediakan oleh modul pengguna. Konteks aktivasi dibuat di AfxWinInit
. Untuk informasi selengkapnya, lihat Dukungan untuk Konteks Aktivasi dalam Status Modul MFC.
Contoh
#include <afx.h>
#include <afxdb.h>
int _tmain(int /*argc*/, TCHAR * /*argv[]*/, TCHAR * /*envp[]*/)
{
int nRetCode = 0;
// initialize MFC and print and error on failure
if (!AfxWinInit(::GetModuleHandle(NULL), NULL, ::GetCommandLine(), 0))
{
// TODO: change error code to suit your needs
_tprintf(_T("Fatal Error: MFC initialization failed\n"));
nRetCode = 1;
}
else
{
// try to connect to an ODBC database that doesn't exist
// (this wouldn't work at all without initializing MFC)
CDatabase db;
try
{
db.Open(_T("This Databsae Doesn't Exist"));
// we shouldn't realistically get here
_tprintf_s(_T("Successful!\n")
_T("Closing ...\n"));
db.Close();
_tprintf_s(_T("Closed!"));
}
catch (CDBException *pEx)
{
// we got an exception! print an error message
// (this wouldn't work without initializing MFC)
TCHAR sz[1024];
_tprintf_s(_T("Error: "));
if (pEx->GetErrorMessage(sz, 1024))
_tprintf_s(sz);
else
_tprintf_s(_T("No error message was available"));
_tprintf_s(_T("\n"));
pEx->Delete();
nRetCode = 1;
}
}
return nRetCode;
}
Persyaratan
Header afxwin.h
Lihat juga
Makro dan Global
CWinApp
Kelas
CContextMenuManager
Kelas
CWnd
Kelas
CFrameWndEx
Kelas
CMFCToolBar
Kelas
CKeyboardManager
Kelas
CMenuTearOffManager
Kelas
CMouseManager
Kelas
CShellManager
Kelas
CUserToolsManager
Kelas
Saran dan Komentar
https://aka.ms/ContentUserFeedback.
Segera hadir: Sepanjang tahun 2024 kami akan menghentikan penggunaan GitHub Issues sebagai mekanisme umpan balik untuk konten dan menggantinya dengan sistem umpan balik baru. Untuk mengetahui informasi selengkapnya, lihat:Kirim dan lihat umpan balik untuk