用Delphi写一个Windows下的纯SDK程序

技术主管给我的一个考题:用Delphi写一个Windows下的纯SDK程序

其实,无论是Delphi、C++ Builder,还是Visual C++,虽然这些IDE功能性能各异,但通过编译器编译出来的,在Windows上运行的二进制代码,其实是相通的。(其实到汇编层次你就会知道他们编译出的程序没有太大区别了)

纯的SDK,不包含任何其他库类,是一种符合Windows程序设计的通用的标准,不经过任何封装,通过消息机制驱动程序,最原始的反映了Windows的程序运行的基本流程。

对于SDK程序而言,C/C++能做到的,Delphi Pascal也能做到。虽然在语法上有所不同,但程序的结构上是完全相同的。当然,这里还是需要引用一些单元,这个同Visual C++中包含头文件的道理是一样的。

抛开语言的界限,其实都一样。

 

  1. //作者:zencher
  2. //
  3. //说明:这是一个完全基于Windows SDK的,由Delphi编写的程序。
  4. //该程序会创建一个有白色背景的窗口和一个按钮,点击按钮,窗口消
  5. //失,并生成系统托盘,双击系统托盘,窗口出现。
  6. //
  7. program SDK_Delphi;
  8. uses
  9.   Windows, Messages, ShellApi;
  10. var
  11.   msg: TMsg;             //消息结构体
  12.   wndClass: TWndClass;   //窗口类
  13.   hWnd: THandle;         //窗口句柄
  14.   ni: TNOTIFYICONDATA;   //关于通知图标的信息的结构体,用于生成系统托盘
  15. //窗口处理函数
  16. function WndProc(hwnd: THandle; MsgID: UINT; wParam, lParam: Integer):
  17. LRESULT;
  18.   stdcall;
  19. var
  20.   hCtrlWnd: THANDLE;    //按钮控件句柄
  21.   dc: HDC;
  22.   ps: TPaintStruct;
  23. begin
  24. //根据不同的消息做不同的处理
  25.   case MsgID of
  26.     1001:    //自定义消息,在双击系统托盘时产生
  27.       begin
  28.         if WM_LBUTTONDBLCLK = lParam then
  29.         begin
  30.           ShowWindow(hwnd, SW_NORMAL);
  31.           Shell_NotifyIcon(NIM_DELETE, @ni);
  32.         end;
  33.         Exit;
  34.       end;
  35.     WM_SYSCOMMAND:
  36.       begin
  37.         if wParam = SC_MINIMIZE then
  38.         begin
  39.           SendMessage(hwnd, WM_COMMAND, 10);
  40.         end
  41.         else
  42.           Result := DefWindowProc(hwnd, MsgID, wParam, lParam);
  43.       end;
  44.     WM_COMMAND:
  45.       begin
  46.         if wParam = 1 then
  47.         begin
  48.           ni.cbSize := sizeof(TNOTIFYICONDATA);
  49.           ni.Wnd := hwnd;
  50.           ni.uFlags := NIF_MESSAGE or NIF_INFO or NIF_TIP or NIF_ICON;
  51.           ni.uID := 1000;
  52.           ni.hIcon := LoadIcon(0, IDI_APPLICATION);
  53.           ni.uCallbackMessage := 1001;
  54.           ni.szInfo := '双击这里恢复窗口';
  55.           ni.szInfoTitle := '注意!';
  56.           ni.szTip := 'SDK_BY_DELPHI';
  57.           ni.uTimeout := 15;
  58.           Shell_NotifyIcon(NIM_ADD, @ni);
  59.           ShowWindow(hwnd, SW_HIDE);
  60.         end;
  61.       end;
  62.     WM_PAINT:
  63.       begin
  64.         dc := BeginPaint(hwnd, ps);
  65.         TextOut(dc, 2020'这是一个用Delphi写的SDK程序',
  66.           length('这是一个用Delphi写的SDK程序'));
  67.         EndPaint(hwnd, ps);
  68.         Exit;
  69.       end;
  70.     WM_CREATE:
  71.       begin
  72.         hCtrlWnd := CreateWindow('BUTTON',
  73.           'Click Here',
  74.           WS_CHILD or WS_VISIBLE or BS_PUSHBUTTON,
  75.           2050,
  76.           10030,
  77.           hwnd, 1,
  78.           system.MainInstance, 0);
  79.         Exit;
  80.       end;
  81.     WM_CLOSE:
  82.       begin
  83.         if MessageBox(hwnd, '你确定要关闭吗?',
  84.           '哦?要关闭啊?', MB_YESNO) = IDYES then
  85.           PostQuitMessage(0);
  86.         Exit;
  87.       end;
  88.   else
  89.     Result := DefWindowProc(hwnd, MsgID, wParam, lParam);
  90.   end;
  91. end;
  92. begin
  93. //创建窗口类
  94.   wndclass.style := CS_HREDRAW or CS_VREDRAW;
  95.   wndclass.lpfnWndProc := @WndProc;
  96.   wndclass.cbClsExtra := 0;
  97.   wndclass.cbWndExtra := DLGWINDOWEXTRA;
  98.   wndclass.hInstance := system.MainInstance;
  99.   wndclass.hIcon := LoadIcon(0, IDI_APPLICATION);
  100.   wndclass.hCursor := LoadCursor(0, IDC_ARROW);
  101.   wndclass.hbrBackground := GetStockObject(WHITE_BRUSH);
  102.   wndclass.lpszMenuName := nil;
  103.   wndclass.lpszClassName := 'SDK_BY_DELPHI';
  104. //注册窗口类
  105.   if RegisterClass(wndclass) = 0 then
  106.   begin
  107.     Exit;
  108.   end;
  109. //创建窗口
  110.   hWnd := CreateWindow('SDK_BY_DELPHI',
  111.     'A SDK Program make by Delphi!',
  112.     WS_OVERLAPPEDWINDOW,
  113.     CW_USEDEFAULT,
  114.     CW_USEDEFAULT,
  115.     CW_USEDEFAULT,
  116.     CW_USEDEFAULT,
  117.     0,
  118.     0,
  119.     system.MainInstance,
  120.     0);
  121. //更新和显示窗口
  122.   ShowWindow(hwnd, SW_NORMAL);
  123.   UpdateWindow(hWnd);
  124. //消息循环
  125.   while GetMessage(&msg, 000do
  126.   begin
  127.     TranslateMessage(msg);
  128.     DispatchMessage(msg);
  129.   end;
  130. end.

写过SDK程序的朋友一定觉得很熟悉吧。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
修改说明: ================================================================================== 1 原版只支持Delphi XE,本版改为可以支持Delphi6/7,在Delphi6下编译运行通过 2 修正了原版无法支持中文名称的BUG 使用示例: ================================================================================== ossTemp := TAliOssFileSystem.Create(OSS_ACCESS_ID, OSS_ASSCESS_KEY, OSS_HOSTNAME); ossTemp.ChangeVolumn(sBucketName); ossTemp.UploadFile(sLocalFileName, sOSSFileName); ossTemp.Free; 原版说明: ================================================================================== 该SDK使用Delphi/Object Pascal编程语言编,完整实现了阿里云OSS API的全部功能,并提 供了两套API:第一套API(类名:TAliOss)仿照OSS PHP SDK实现了全部函数,第二套API( 类名:TAliOssFileSystem)封装了TAliOss,并在其的基础上实现了类似于文件系统的API, 实现了包括“卷”、“文件夹”、“文件”等抽象概念,并提供相应的功能函数。 两套API面向的应用场景不同:TAliOssFileSystem适合于将OSS服务看作是一种文件系统的应 用,开发人员不必了解OSS API的内部参数及XML定义,可提高编程效率,使用方便;TAliOSS 适合于其他类型的应用,当编程人员需要更加定制化的调用或者需要更加灵活的参数设置时, 可以直接使用该SDK操作调用参数和返回值。两套API互不干扰,可以在项目中同时使用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值