Use1Dlg.cpp
上传用户:sz6275
上传日期:2022-06-17
资源大小:80k
文件大小:5k
源码类别:

ActiveX/DCOM/ATL

开发平台:

Visual C++

  1. // Use1Dlg.cpp : implementation file
  2. //
  3. #include "stdafx.h"
  4. #include "Use1.h"
  5. #include "Use1Dlg.h"
  6. #ifdef _DEBUG
  7. #define new DEBUG_NEW
  8. #undef THIS_FILE
  9. static char THIS_FILE[] = __FILE__;
  10. #endif
  11. /////////////////////////////////////////////////////////////////////////////
  12. // CUse1Dlg dialog
  13. CUse1Dlg::CUse1Dlg(CWnd* pParent /*=NULL*/)
  14. : CDialog(CUse1Dlg::IDD, pParent)
  15. {
  16. //{{AFX_DATA_INIT(CUse1Dlg)
  17. // NOTE: the ClassWizard will add member initialization here
  18. //}}AFX_DATA_INIT
  19. // Note that LoadIcon does not require a subsequent DestroyIcon in Win32
  20. m_hIcon = AfxGetApp()->LoadIcon(IDR_MAINFRAME);
  21. }
  22. void CUse1Dlg::DoDataExchange(CDataExchange* pDX)
  23. {
  24. CDialog::DoDataExchange(pDX);
  25. //{{AFX_DATA_MAP(CUse1Dlg)
  26. // NOTE: the ClassWizard will add DDX and DDV calls here
  27. //}}AFX_DATA_MAP
  28. }
  29. BEGIN_MESSAGE_MAP(CUse1Dlg, CDialog)
  30. //{{AFX_MSG_MAP(CUse1Dlg)
  31. ON_WM_PAINT()
  32. ON_WM_QUERYDRAGICON()
  33. ON_BN_CLICKED(IDC_BUTTON1, OnButton1)
  34. ON_BN_CLICKED(IDC_BUTTON2, OnButton2)
  35. //}}AFX_MSG_MAP
  36. END_MESSAGE_MAP()
  37. /////////////////////////////////////////////////////////////////////////////
  38. // CUse1Dlg message handlers
  39. BOOL CUse1Dlg::OnInitDialog()
  40. {
  41. CDialog::OnInitDialog();
  42. // Set the icon for this dialog.  The framework does this automatically
  43. //  when the application's main window is not a dialog
  44. SetIcon(m_hIcon, TRUE); // Set big icon
  45. SetIcon(m_hIcon, FALSE); // Set small icon
  46. // TODO: Add extra initialization here
  47. return TRUE;  // return TRUE  unless you set the focus to a control
  48. }
  49. // If you add a minimize button to your dialog, you will need the code below
  50. //  to draw the icon.  For MFC applications using the document/view model,
  51. //  this is automatically done for you by the framework.
  52. void CUse1Dlg::OnPaint() 
  53. {
  54. if (IsIconic())
  55. {
  56. CPaintDC dc(this); // device context for painting
  57. SendMessage(WM_ICONERASEBKGND, (WPARAM) dc.GetSafeHdc(), 0);
  58. // Center icon in client rectangle
  59. int cxIcon = GetSystemMetrics(SM_CXICON);
  60. int cyIcon = GetSystemMetrics(SM_CYICON);
  61. CRect rect;
  62. GetClientRect(&rect);
  63. int x = (rect.Width() - cxIcon + 1) / 2;
  64. int y = (rect.Height() - cyIcon + 1) / 2;
  65. // Draw the icon
  66. dc.DrawIcon(x, y, m_hIcon);
  67. }
  68. else
  69. {
  70. CDialog::OnPaint();
  71. }
  72. }
  73. // The system calls this to obtain the cursor to display while the user drags
  74. //  the minimized window.
  75. HCURSOR CUse1Dlg::OnQueryDragIcon()
  76. {
  77. return (HCURSOR) m_hIcon;
  78. }
  79. // 包含组件编译后给我们生成的 C 语言的接口描述文件
  80. #include "..Simple1simple1.h"
  81. #include "..Simple1Simple1_i.c"
  82. void CUse1Dlg::OnButton1() 
  83. {
  84. ::CoInitialize( NULL );
  85. IUnknown * pUnk = NULL;
  86. IFun * pFun = NULL;
  87. HRESULT hr;
  88. try
  89. {
  90. hr = ::CoCreateInstance(
  91. CLSID_Fun,
  92. NULL,
  93. CLSCTX_INPROC_SERVER, // 以进程内组件 DLL 方式加载
  94. IID_IUnknown, // 想取得 IUnknown 接口指针
  95. (LPVOID *) &pUnk);
  96. if( FAILED( hr ) ) throw( _T("没注册吧?") );
  97. hr = pUnk->QueryInterface( // 从 IUnknown 得到其它接口指针
  98. IID_IFun, // 想取得 IFun 接口指针
  99. (LPVOID *)&pFun );
  100. if( FAILED( hr ) ) throw( _T("居然没有接口?") );
  101. long nSum;
  102. hr = pFun->Add( 1, 2, &nSum ); // IFun::Add()
  103. if( SUCCEEDED( hr ) )
  104. {
  105. CString sMsg;
  106. sMsg.Format( _T("1 + 2 = %d"), nSum );
  107. AfxMessageBox( sMsg );
  108. }
  109. BSTR s1 = ::SysAllocString( L"Hello" );
  110. BSTR s2 = ::SysAllocString( L" world" );
  111. BSTR s3 = NULL;
  112. hr = pFun->Cat( s1, s2, &s3 ); // IFun::Cat()
  113. if( SUCCEEDED( hr ) )
  114. {
  115. CString sMsg( s3 );
  116. AfxMessageBox( sMsg );
  117. }
  118. // IFun::Cat()最后一个参数是 [out] 方向属性,因此调用者要释放内存
  119. if( s3 ) ::SysFreeString( s3 );
  120. }
  121. catch( LPCTSTR lpErr )
  122. {
  123. AfxMessageBox( lpErr );
  124. }
  125. if( pUnk ) pUnk->Release();
  126. if( pFun ) pFun->Release();
  127. ::CoUninitialize();
  128. }
  129. // 包含 CComBSTR 需要使用的头文件
  130. #include <atlbase.h>
  131. void CUse1Dlg::OnButton2() 
  132. {
  133. ::CoInitialize( NULL );
  134. IFun * pFun = NULL;
  135. HRESULT hr;
  136. try
  137. {
  138. hr = ::CoCreateInstance(
  139. CLSID_Fun,
  140. NULL,
  141. CLSCTX_INPROC_SERVER,
  142. IID_IFun, // 不再经过 IUnknown, 直接想得到 IFun 接口指针
  143. (LPVOID *) &pFun);
  144. if( FAILED( hr ) ) throw( _T("没注册吧或没有接口?") );
  145. long nSum;
  146. hr = pFun->Add( 1, 2, &nSum );
  147. if( SUCCEEDED( hr ) )
  148. {
  149. CString sMsg;
  150. sMsg.Format( _T("1 + 2 = %d"), nSum );
  151. AfxMessageBox( sMsg );
  152. }
  153. CComBSTR s1( "Hello" ); // 不再使用 API 方式操作 BSTR
  154. CComBSTR s2( " world" ); // 使用 CComBSTR 的包装类比较简单,并且
  155. CComBSTR s3; // 最大的好处是不用咱们自己来释放
  156. hr = pFun->Cat( s1, s2, &s3 );
  157. if( SUCCEEDED( hr ) )
  158. {
  159. CString sMsg( s3 );
  160. AfxMessageBox( sMsg );
  161. }
  162. }
  163. catch( LPCTSTR lpErr )
  164. {
  165. AfxMessageBox( lpErr );
  166. }
  167. if( pFun ) pFun->Release();
  168. ::CoUninitialize();
  169. }