Bagikan melalui


Kontrol Aplikasi

OLE memerlukan kontrol yang besar atas aplikasi dan objeknya. DLL sistem OLE harus dapat meluncurkan dan merilis aplikasi secara otomatis, mengoordinasikan produksi dan modifikasi objek mereka, dan sebagainya. Fungsi dalam topik ini memenuhi persyaratan tersebut. Selain dipanggil oleh DLL sistem OLE, fungsi-fungsi ini kadang-kadang harus dipanggil oleh aplikasi juga.

Kontrol Aplikasi

Nama Deskripsi
AfxOleCanExitApp Menunjukkan apakah aplikasi dapat dihentikan.
AfxOleGetMessageFilter Mengambil filter pesan aplikasi saat ini.
AfxOleGetUserCtrl Mengambil bendera kontrol pengguna saat ini.
AfxOleSetUserCtrl Mengatur atau menghapus bendera kontrol pengguna.
AfxOleLockApp Menaikkan jumlah global kerangka kerja dari jumlah objek aktif dalam aplikasi.
AfxOleLockControl Mengunci pabrik kelas dari kontrol yang ditentukan.
AfxOleUnlockApp Mengurangi jumlah kerangka kerja dari jumlah objek aktif dalam aplikasi.
AfxOleUnlockControl Membuka kunci pabrik kelas dari kontrol yang ditentukan.
AfxOleRegisterServerClass Mendaftarkan server di registri sistem OLE.
AfxOleSetEditMenu Menerapkan antarmuka pengguna untuk perintah typename Object.

AfxOleCanExitApp

Menunjukkan apakah aplikasi dapat dihentikan.

BOOL AFXAPI AfxOleCanExitApp();

Tampilkan Nilai

Nonzero jika aplikasi dapat keluar; jika tidak, 0.

Keterangan

Aplikasi tidak boleh mengakhiri jika ada referensi yang luar biasa ke objeknya. Fungsi global AfxOleLockApp dan AfxOleUnlockApp kenaikan dan penurunan, masing-masing, penghitung referensi ke objek aplikasi. Aplikasi tidak boleh dihentikan ketika penghitung ini bukan nol. Jika penghitung bukan nol, jendela utama aplikasi disembunyikan (tidak dihancurkan) saat pengguna memilih Tutup dari menu sistem atau Keluar dari menu File. Kerangka kerja memanggil fungsi ini di CFrameWnd::OnClose.

Contoh

// Helper exit function for automation server
BOOL CMainFrame::CanExit()
{
   if (AfxOleCanExitApp())
   {
      // No outstanding object counts - go ahead and exit
      return TRUE;
   }
   else
   {
      // There are outstanding OLE object counts...
      // hide app to give user impression that application has exited.
      ShowWindow(SW_HIDE);
      // take user out of control of the app
      AfxOleSetUserCtrl(FALSE);
      return FALSE;
   }
}

Persyaratan

Header: afxdisp.h

AfxOleGetMessageFilter

Mengambil filter pesan aplikasi saat ini.

COleMessageFilter* AFXAPI AfxOleGetMessageFilter();

Tampilkan Nilai

Penunjuk ke filter pesan saat ini.

Keterangan

Panggil fungsi ini untuk mengakses objek -turunan saat ini COleMessageFilter, seperti yang Akan Anda panggil AfxGetApp untuk mengakses objek aplikasi saat ini.

Contoh

COleMessageFilter *pFilter = AfxOleGetMessageFilter();
ASSERT_VALID(pFilter);
pFilter->BeginBusyState();
// do things requiring a busy state
pFilter->EndBusyState();

 

// Another example
//CWinApp-derived class
BOOL CCMFCAutomationApp::InitInstance()
{
   CWinApp::InitInstance();

   // Initialize OLE libraries
   if (!AfxOleInit())
   {
      AfxMessageBox(IDP_OLE_INIT_FAILED);
      return FALSE;
   }

   CWinThread *pThread = AfxGetThread();
   if (pThread != NULL)
   {
      // Destroy message filter, thereby unregistering it.
      delete pThread->m_pMessageFilter;
      pThread->m_pMessageFilter = NULL;

      // Create the new message filter object.
      //CMyMessageFilter is derived from COleMessageFilter
      pThread->m_pMessageFilter = new CMyMessageFilter;
      ASSERT(AfxOleGetMessageFilter() != NULL);

      // Register the new message filter object.
      AfxOleGetMessageFilter()->Register();
   }
   //...
   //...
   //...
}

Persyaratan

Header: afxwin.h

AfxOleGetUserCtrl

Mengambil bendera kontrol pengguna saat ini.

BOOL AFXAPI AfxOleGetUserCtrl();

Tampilkan Nilai

Nonzero jika pengguna memegang kendali atas aplikasi; jika tidak, 0.

Keterangan

Pengguna memegang kendali atas aplikasi ketika pengguna telah secara eksplisit membuka atau membuat dokumen baru. Pengguna juga memegang kendali jika aplikasi tidak diluncurkan oleh DLL sistem OLE — dengan kata lain, jika pengguna meluncurkan aplikasi dengan shell sistem.

Persyaratan

Header: afxdisp.h

AfxOleSetUserCtrl

Mengatur atau menghapus bendera kontrol pengguna, yang dijelaskan dalam referensi untuk AfxOleGetUserCtrl.

void AFXAPI AfxOleSetUserCtrl(BOOL bUserCtrl);

Parameter

bUserCtrl
Menentukan apakah bendera kontrol pengguna akan diatur atau dibersihkan.

Keterangan

Kerangka kerja memanggil fungsi ini saat pengguna membuat atau memuat dokumen, tetapi tidak ketika dokumen dimuat atau dibuat melalui tindakan tidak langsung seperti memuat objek yang disematkan dari aplikasi kontainer.

Panggil fungsi ini jika tindakan lain dalam aplikasi Anda harus menempatkan pengguna dalam kontrol aplikasi.

Persyaratan

Header: afxdisp.h

AfxOleLockApp

Menaikkan jumlah global kerangka kerja dari jumlah objek aktif dalam aplikasi.

void AFXAPI AfxOleLockApp();

Keterangan

Kerangka kerja menyimpan hitungan jumlah objek yang aktif dalam aplikasi. Fungsi AfxOleLockApp dan AfxOleUnlockApp , masing-masing, kenaikan dan penurunan jumlah ini.

Ketika pengguna mencoba menutup aplikasi yang memiliki objek aktif - aplikasi yang jumlah objek aktifnya bukan nol - kerangka kerja menyembunyikan aplikasi dari tampilan pengguna alih-alih sepenuhnya mematikannya. Fungsi ini AfxOleCanExitApp menunjukkan apakah aplikasi dapat dihentikan.

Panggil AfxOleLockApp dari objek apa pun yang mengekspos antarmuka OLE, jika tidak diinginkan agar objek tersebut dihancurkan saat masih digunakan oleh aplikasi klien. Panggil AfxOleUnlockApp juga destruktor objek apa pun yang memanggil AfxOleLockApp di konstruktor. Secara default, COleDocument (dan kelas turunan) secara otomatis mengunci dan membuka kunci aplikasi.

Contoh

// Below is a code sample from an  Application Wizard-generated SDI
// Application with Automation support. The Application Wizard adds a
// dispatch interface to the document class. AfxOleLockApp() and
// AfxOleUnlockApp() respectively increment and decrement the
// application's object count. When the object count is equal to
// zero and if the user has not taken control of the application,
// the server is terminated.

CCMFCAutomationDoc::CCMFCAutomationDoc()
{
   EnableAutomation();
   AfxOleLockApp();
}

CCMFCAutomationDoc::~CCMFCAutomationDoc()
{
   AfxOleUnlockApp();
}

Persyaratan

Header: afxdisp.h

AfxOleUnlockApp

Mengurangi jumlah objek aktif kerangka kerja dalam aplikasi.

void AFXAPI AfxOleUnlockApp();

Keterangan

Lihat AfxOleLockApp untuk informasi lebih lanjut.

Ketika jumlah objek aktif mencapai nol, AfxOleOnReleaseAllObjects dipanggil.

Contoh

Lihat contoh untuk AfxOleLockApp.

Persyaratan

Header: afxdisp.h

AfxOleLockControl

Mengunci pabrik kelas kontrol yang ditentukan sehingga data yang dibuat secara dinamis yang terkait dengan kontrol tetap berada dalam memori.

Sintaks

BOOL AFXAPI AfxOleLockControl(  REFCLSID clsid  );
BOOL AFXAPI AfxOleLockControl( LPCTSTR lpszProgID );

Parameter

clsid
ID kelas unik kontrol.

lpszProgID
ID program unik kontrol.

Tampilkan Nilai

Bukan nol jika pabrik kelas kontrol berhasil dikunci; jika tidak, 0.

Keterangan

Ini dapat mempercepat tampilan kontrol secara signifikan. Misalnya, setelah Anda membuat kontrol dalam kotak dialog dan mengunci kontrol dengan AfxOleLockControl, Anda tidak perlu membuat dan membunuhnya lagi setiap kali dialog ditampilkan atau dihancurkan. Jika pengguna membuka dan menutup kotak dialog berulang kali, mengunci kontrol Anda dapat meningkatkan performa secara signifikan. Ketika Anda siap untuk menghancurkan kontrol, panggil AfxOleUnlockControl.

Contoh

// Starts and locks control's (Microsoft Calendar) class factory.
// Control will remain in memory for lifetime of
// application or until AfxOleUnlockControl() is called.

AfxOleLockControl(_T("MSCAL.Calendar"));

Persyaratan

Header: afxwin.h

AfxOleRegisterServerClass

Fungsi ini memungkinkan Anda mendaftarkan server Anda di registri sistem OLE.

BOOL AFXAPI AfxOleRegisterServerClass(
    REFCLSID clsid,
    LPCTSTR lpszClassName,
    LPCTSTR lpszShortTypeName,
    LPCTSTR lpszLongTypeName,
    OLE_APPTYPE nAppType = OAT_SERVER,
    LPCTSTR* rglpszRegister = NULL,
    LPCTSTR* rglpszOverwrite = NULL);

Parameter

clsid
Referensi ke ID kelas OLE server.

lpszClassName
Penunjuk ke string yang berisi nama kelas objek server.

lpszShortTypeName
Penunjuk ke string yang berisi nama pendek jenis objek server, seperti "Bagan."

lpszLongTypeName
Penunjuk ke string yang berisi nama panjang tipe objek server, seperti "Bagan Microsoft Excel 5.0."

nAppType
Nilai, yang diambil dari enumerasi OLE_APPTYPE, menentukan jenis aplikasi OLE. Nilai yang mungkin adalah sebagai berikut:

  • OAT_INPLACE_SERVER Server memiliki antarmuka pengguna server penuh.

  • OAT_SERVER Server hanya mendukung penyematan.

  • OAT_CONTAINER Container mendukung tautan ke penyematan.

  • IDispatchOAT_DISPATCH_OBJECT -mampu objek.

rglpszRegister
Array pointer ke string yang mewakili kunci dan nilai yang akan ditambahkan ke registri sistem OLE jika tidak ada nilai untuk kunci yang ditemukan.

rglpszOverwrite
Array pointer ke string yang mewakili kunci dan nilai yang akan ditambahkan ke registri sistem OLE jika registri berisi nilai yang ada untuk kunci yang diberikan.

Tampilkan Nilai

Bukan nol jika kelas server berhasil didaftarkan; jika tidak, 0.

Keterangan

Sebagian besar aplikasi dapat digunakan COleTemplateServer::Register untuk mendaftarkan jenis dokumen aplikasi. Jika format registri sistem aplikasi Anda tidak sesuai dengan pola umum, Anda dapat menggunakan AfxOleRegisterServerClass untuk kontrol lebih lanjut.

Registri terdiri dari sekumpulan kunci dan nilai. Argumen rglpszRegister dan rglpszOverwrite adalah array pointer ke string, masing-masing terdiri dari kunci dan nilai yang dipisahkan oleh karakter NULL ( '\0'). Masing-masing string ini dapat memiliki parameter yang dapat diganti yang tempatnya ditandai oleh urutan karakter %1 hingga %5.

Simbol diisi sebagai berikut:

Simbol Nilai
%1 ID Kelas, diformat sebagai string
%2 Nama Kelas
%3 Jalur ke file yang dapat dieksekusi
4% Nama jenis pendek
5% Nama jenis panjang

Persyaratan

Header: afxdisp.h

AfxOleSetEditMenu

Menerapkan antarmuka pengguna untuk perintah typename Object.

void AFXAPI AfxOleSetEditMenu(
    COleClientItem* pClient,
    CMenu* pMenu,
    UINT iMenuItem,
    UINT nIDVerbMin,
    UINT nIDVerbMax = 0,
    UINT nIDConvert = 0);

Parameter

pClient
Penunjuk ke item OLE klien.

pMenu
Penunjuk ke objek menu yang akan diperbarui.

iMenuItem
Indeks item menu yang akan diperbarui.

nIDVerbMin
ID perintah yang sesuai dengan kata kerja utama.

nIDVerbMax
ID perintah yang sesuai dengan kata kerja terakhir.

nIDConvert
ID untuk item menu Konversi.

Keterangan

Jika server hanya mengenali kata kerja utama, item menu menjadi "objek typename kata kerja" dan perintah nIDVerbMin dikirim ketika pengguna memilih perintah . Jika server mengenali beberapa kata kerja, maka item menu menjadi " typename Object" dan submenu yang mencantumkan semua kata kerja muncul saat pengguna memilih perintah. Ketika pengguna memilih kata kerja dari submenu, nIDVerbMin dikirim jika kata kerja pertama dipilih, nIDVerbMin + 1 dikirim jika kata kerja kedua dipilih, dan sebagainya. Implementasi default COleDocument secara otomatis menangani fitur ini.

Anda harus memiliki pernyataan berikut dalam skrip sumber daya aplikasi klien Anda (. RC) file:

<#include afxolecl.rc>

Persyaratan

Header: afxole.h

AfxOleUnlockControl

Membuka kunci pabrik kelas dari kontrol yang ditentukan.

Sintaks

BOOL AFXAPI AfxOleUnlockControl( REFCLSID clsid );
BOOL AFXAPI AfxOleUnlockControl( LPCTSTR lpszProgID );

Parameter

clsid
ID kelas unik kontrol.

lpszProgID
ID program unik kontrol.

Tampilkan Nilai

Bukan nol jika pabrik kelas kontrol berhasil dibuka; jika tidak, 0.

Keterangan

Kontrol dikunci dengan AfxOleLockControl, sehingga data yang dibuat secara dinamis yang terkait dengan kontrol tetap dalam memori. Ini dapat mempercepat tampilan kontrol secara signifikan karena kontrol tidak perlu dibuat dan dihancurkan setiap kali ditampilkan. Ketika Anda siap untuk menghancurkan kontrol, panggil AfxOleUnlockControl.

Contoh

// Unlock control's (Microsoft Calendar Control) class factory.

AfxOleUnlockControl(_T("MSCAL.Calendar"));

Persyaratan

Header: afxwin.h

Lihat juga

Makro dan Global