⭐ 欢迎来到虫虫下载站! | 📦 资源下载 📁 资源专辑 ℹ️ 关于我们
⭐ 虫虫下载站

📄 21. 动态链接库.txt

📁 本书介绍了在Microsoft Windows 98、Microsoft Windows NT 4.0和Windows NT 5.0下程序写作的方法
💻 TXT
📖 第 1 页 / 共 5 页
字号:
        
  }
        
                  // If given string not in list, return without taking action
        
           if (i == iTotal)
        
                          return FALSE ;
        
                  // Else adjust list downward
        
           for (j = i ; j < iTotal ; j++)
        
                          wcscpy (szStrings[j], szStrings[j + 1]) ;
        
           szStrings[iTotal-][0] = '\0' ;
        
           return TRUE ;
        
}
        

EXPORT int CALLBACK GetStringsA (GETSTRCB pfnGetStrCallBack, PVOID pParam)
        
{
        
           BOOL          bReturn ;
        
           int           i, iLength ;
        
           PSTR          pAnsiStr ;
        

    for (i = 0 ; i < iTotal ; i++)
        
           {
        
                                  // Convert string from Unicode
        
iLength = WideCharToMultiByte (    CP_ACP, 0, szStrings[i], -1, NULL, 0, NULL, NULL) ;
        
                   pAnsiStr = malloc (iLength) ;
        
         WideCharToMultiByte (    CP_ACP, 0, szStrings[i], -1, pAnsiStr, iLength, NULL, NULL) ;
        

                                                 // Call callback function
        

                   bReturn = pfnGetStrCallBack (pAnsiStr, pParam) ;
        
        
        
                   if (bReturn == FALSE)
        
                                                 return i + 1 ;
        

                   free (pAnsiStr) ;
        
           }
        
           return iTotal ;
        
}
        

EXPORT int CALLBACK GetStringsW (GETSTRCB pfnGetStrCallBack, PVOID pParam)
        
{
        
           BOOL          bReturn ;
        
           int           i ;
        
   
        
          for (i = 0 ; i < iTotal ; i++)
        
           {
        
                  bReturn = pfnGetStrCallBack (szStrings[i], pParam) ;
        
                  if (bReturn == FALSE)
        
                                         return i + 1 ;
        
           }
        
          return iTotal ;
        
}
        
除了DllMain函数以外,STRLIB中只有六个函数供其它函数输出用。所有这些函数都按EXPORT定义。这会使LINK在STRLIB.LIB引用链接库中列出它们。

STRPROG程序


STRPROG程序如程序21-4所示,其内容相当浅显易懂。两个菜单选项(Enter和Delete)启动一个对话框,让您输入一个字符串,然后STRPROG呼叫AddString或者DeleteString。当程序需要更新它的显示区域时,呼叫GetStrings并使用函数GetStrCallBack来列出所列举的字符串。

程序21-4 STRPROG 
       
STRPROG.C
        
/*----------------------------------------------------------------------------
        
  STRPROG.C -   Program using STRLIB dynamic-link library
        
                                                         (c) Charles Petzold, 1998
        
-----------------------------------------------------------------------------*/
        
#include <windows.h>
        
#include "strlib.h"
        
#include "resource.h"
        

typedef struct
        
{
        
           HDC    hdc ;
        
           int    xText ;
        
           int    yText ;
        
           int    xStart ;
        
           int    yStart ;
        
           int    xIncr ;
        
           int    yIncr ;
        
           int    xMax ;
        
           int    yMax ;
        
}
        
CBPARAM ;
        
LRESULT     CALLBACK WndProc (HWND, UINT, WPARAM, LPARAM) ;
        
TCHAR              szAppName [] = TEXT ("StrProg") ;
        
TCHAR szString [MAX_LENGTH + 1] ;
        
int WINAPI WinMain (HINSTANCE hInstance, HINSTANCE hPrevInstance,
        
                                                               PSTR szCmdLine, int iCmdShow)
        
{
        
         HWND                          hwnd ;
        
           MSG                   msg ;
        
           WNDCLASS              wndclass ;
        
   
        
           wndclass.style                               = CS_HREDRAW | CS_VREDRAW ;
        
           wndclass.lpfnWndProc                         = WndProc ;
        
           wndclass.cbClsExtra                          = 0 ;
        
           wndclass.cbWndExtra                          = 0 ;
        
           wndclass.hInstance                           = hInstance ;
        
           wndclass.hIcon                               = LoadIcon (NULL, IDI_APPLICATION) ;
        
           wndclass.hCursor                   = LoadCursor (NULL, IDC_ARROW) ;
        
           wndclass.hbrBackground              = (HBRUSH) GetStockObject (WHITE_BRUSH) ;
        
           wndclass.lpszMenuName                = szAppName ;
        
           wndclass.lpszClassName               = szAppName ;
        
   
        
           if (!RegisterClass (&wndclass))
        
           {
        
                  MessageBox (  NULL, TEXT ("This program requires Windows NT!"),
        
                                                                       szAppName, MB_ICONERROR) ;
        
                  return 0 ;
        
    }
        

           hwnd = CreateWindow (szAppName, TEXT ("DLL Demonstration Program"),
        
                                  WS_OVERLAPPEDWINDOW,
        
                                  CW_USEDEFAULT, CW_USEDEFAULT,
        
                                 CW_USEDEFAULT, CW_USEDEFAULT,
        
                                  NULL, NULL, hInstance, NULL) ;
        
   
        
           ShowWindow (hwnd, iCmdShow) ;
        
           UpdateWindow (hwnd) ;
        
   
        
           while (GetMessage (&msg, NULL, 0, 0))
        
           {
        
                  TranslateMessage (&msg) ;
        
                  DispatchMessage (&msg) ;
        
           }
        
           return msg.wParam ;
        
}
        

BOOL CALLBACK DlgProc (HWND hDlg, UINT message, WPARAM wParam, LPARAM lParam)
        
{
        
           switch (message)
        
           {
        
           case   WM_INITDIALOG:
        
                          SendDlgItemMessage (hDlg, IDC_STRING, EM_LIMITTEXT, MAX_LENGTH, 0) ;
        
                          return TRUE ;
        
        
        
           case   WM_COMMAND:
        
                          switch (wParam)
        
                          {
        
                          case   IDOK:
        
                                                 GetDlgItemText (hDlg, IDC_STRING, szString, MAX_LENGTH) ;
        
                                               EndDialog (hDlg, TRUE) ;
        
                                                return TRUE ;
        
             
        
                          case   IDCANCEL:
        
                                                 EndDialog (hDlg, FALSE) ;
        
                                                 return TRUE ;
        
                        }
        
           }
        
           return FALSE ;
        
}
        

BOOL CALLBACK GetStrCallBack (PTSTR pString, CBPARAM * pcbp)
        
{
        
           TextOut (     pcbp->hdc, pcbp->xText, pcbp->yText,
        
                                                 pString, lstrlen (pString)) ;
        
   
        
           if ((pcbp->yText += pcbp->yIncr) > pcbp->yMax)
        
           {
        
                          pcbp->yText = pcbp->yStart ;
        
                          if ((pcbp->xText += pcbp->xIncr) > pcbp->xMax)
        
                                                 return FALSE ;
        
           }
        
           return TRUE ;
        
}
        

LRESULT CALLBACK WndProc (HWND hwnd, UINT message, WPARAM wParam, LPARAM lParam)
        
{
        
           static HINSTANCE              hInst ;
        
           static int                                   cxChar, cyChar, cxClient, cyClient ;
        
           static UINT                          iDataChangeMsg ;
        
           CBPARAM                                              cbparam ;
        
           HDC                                                         hdc ;

⌨️ 快捷键说明

复制代码 Ctrl + C
搜索代码 Ctrl + F
全屏模式 F11
切换主题 Ctrl + Shift + D
显示快捷键 ?
增大字号 Ctrl + =
减小字号 Ctrl + -