调用CALLBACK标记的dll方法要用dll = ctypes.windll.LoadLibrary( 'test.dll' )

没有CALLBACK的方法用dll = ctypes.cdll.LoadLibrary( 'test.dll' )

例子:

  1. from ctypes import *
  2. d2d = cdll.LoadLibrary("Direct2dDll.dll")
  3. print(d2d.DCreateWindow)
  4.  
  5. CALLBACK = CFUNCTYPE(c_int,c_int)
  6.  
  7. def py_cmp_func(a):
  8. print(str(a))
  9. return 0;
  10.  
  11. callBackFunc = CALLBACK(py_cmp_func)
  12.  
  13. d2d.SetCallBack(callBackFunc)
  14. d2d.DCreateWindow()
  1. // Direct2dDll.cpp : 定义 DLL 应用程序的导出函数。
  2. //
  3.  
  4. #include "stdafx.h"
  5. #include <Windows.h>
  6. #include <stdio.h>
  7. #include "Draw.h"
  8.  
  9. int (*CallBack)(int);
  10.  
  11. void SetCallBack(int (*fun)(int))
  12. {
  13. (*fun)();
  14. CallBack = fun;
  15. }
  16.  
  17. //
  18. // 函数: WndProc(HWND, UINT, WPARAM, LPARAM)
  19. //
  20. // 目的: 处理主窗口的消息。
  21. //
  22. // WM_COMMAND - 处理应用程序菜单
  23. // WM_PAINT - 绘制主窗口
  24. // WM_DESTROY - 发送退出消息并返回
  25. //
  26. //
  27. LRESULT CALLBACK WndProc(HWND hWnd, UINT message, WPARAM wParam, LPARAM lParam)
  28. {
  29. (*CallBack)((int)message);
  30. int wmId, wmEvent;
  31. PAINTSTRUCT ps;
  32. HDC hdc;
  33.  
  34. switch (message)
  35. {
  36. case WM_PAINT:
  37. hdc = BeginPaint(hWnd, &ps);
  38. // TODO: 在此添加任意绘图代码...
  39. EndPaint(hWnd, &ps);
  40. break;
  41. case WM_DESTROY:
  42. PostQuitMessage();
  43. break;
  44. default:
  45. return DefWindowProc(hWnd, message, wParam, lParam);
  46. }
  47. return ;
  48. }
  49.  
  50. HWND DCreateWindow()
  51. {
  52. HINSTANCE instance = GetModuleHandle();
  53.  
  54. TCHAR szWindowClass[] = L"pw"; // 主窗口类名
  55.  
  56. WNDCLASSEX wcex;
  57.  
  58. wcex.cbSize = sizeof(WNDCLASSEX);
  59. printf("");
  60. wcex.style = CS_HREDRAW | CS_VREDRAW;
  61. wcex.lpfnWndProc = WndProc;
  62. wcex.cbClsExtra = ;
  63. wcex.cbWndExtra = ;
  64. wcex.hInstance = instance;
  65. wcex.hIcon = ;//LoadIcon(hInstance, MAKEINTRESOURCE(IDI_WIN32PROJECT1));
  66. wcex.hCursor = LoadCursor(NULL, IDC_ARROW);
  67. wcex.hbrBackground = (HBRUSH)(COLOR_WINDOW+);
  68. wcex.lpszMenuName = ;//MAKEINTRESOURCE(IDC_WIN32PROJECT1);
  69. wcex.lpszClassName = szWindowClass;
  70. wcex.hIconSm = ;//LoadIcon(wcex.hInstance, MAKEINTRESOURCE(IDI_SMALL));
  71.  
  72. RegisterClassEx(&wcex);
  73. printf("");
  74. HWND hWnd = CreateWindow(szWindowClass, L"title", WS_OVERLAPPEDWINDOW,
  75. CW_USEDEFAULT, , CW_USEDEFAULT, , NULL, NULL, instance, NULL);
  76. printf("");
  77. ShowWindow(hWnd, SW_MAXIMIZE);
  78. UpdateWindow(hWnd);
  79.  
  80. MSG msg;
  81. // 主消息循环:
  82. while (GetMessage(&msg, NULL, , ))
  83. {
  84. if (!TranslateAccelerator(msg.hwnd, , &msg))
  85. {
  86. TranslateMessage(&msg);
  87. DispatchMessage(&msg);
  88. }
  89. }
  90.  
  91. return hWnd;
  92. }

python调用dll的更多相关文章

  1. python调用dll详解

    参考链接https://www.cnblogs.com/TQCAI/p/8881530.html https://www.jb51.net/article/52513.htm https://www. ...

  2. Python调用DLL动态链接库——ctypes使用

    最近要使用python调用C++编译生成的DLL动态链接库,因此学习了一下ctypes库的基本使用. ctypes是一个用于Python的外部函数库,它提供C兼容的数据类型,并允许在DLL或共享库中调 ...

  3. python调用dll方法

    在python中调用dll文件中的接口比较简单,实例代码如下: 如我们有一个test.dll文件,内部定义如下: extern "C"{ int __stdcall test( v ...

  4. python 调用dll中c或c++语言的带指针方法,

    在项目开发中遇到了,python需要去调用一个动态链接库dll中的c++方法.这个方法的参数为一个指针类型的参数,一个bool类型参数, 在python中并未对数字类型进行区分. int LP_Agc ...

  5. python 调用dll 动态链接库 结构体参数及回调函数等示例

    结构体示例: 这里是 C 代码的部分,主要是结构体的声明和回调函数定义. // 新版本定义 typedef enum { DevCard, DevLocator, DevReader } DevTyp ...

  6. Python手机开发调用DLL实现部分ADB功能-乾颐堂

    近期学了一点Python,然后正好有一个手机同步工具方面的预研工作要完成. 要实现PC与手机的通信,首先要找到他们的通信协议,还好的是Android有完善的协议:ADB ADB的代码是开源的,而且支持 ...

  7. Python调用C的DLL(动态链接库)

    开发环境:mingw64位,python3.6 64位 参考博客: mingw编译dll: https://blog.csdn.net/liyuanbhu/article/details/426123 ...

  8. 简单实现python调用c#dll动态链接库

    在python调用c#dll库时要先安装库clr,即安装pythonnet,参考文章:https://www.cnblogs.com/kevin-Y/p/10235125.html(为在python中 ...

  9. Python调用C/C++动态链接库

    Python调用C/C++动态链接库 2013年07月26日 ⁄ 综合 ⁄ 共 3219字 ⁄ 字号 小 中 大 ⁄ 评论关闭   吐槽(可略过):不知不觉,4月份毕业,5月份进入团队,已有7个月.大 ...

随机推荐

  1. python的os.urandom 的用途

    Python中os.urandom(n)的作用 随机产生n个字节(0-255)的字符串,可以作为随机加密key使用~ >>> index = os.urandom(2) >&g ...

  2. 《深入理解mybatis原理7》 MyBatis的二级缓存的设计原理

    <深入理解mybatis原理> MyBatis的二级缓存的设计原理 MyBatis的二级缓存是Application级别的缓存,它可以提高对数据库查询的效率,以提高应用的性能.本文将全面分 ...

  3. IOS UI-键盘处理和UIToolbar

    // // ViewController.m // IOS_0225-键盘处理和UIToolBar // // Created by ma c on 16/2/25. // Copyright © 2 ...

  4. Linux 文件与目录管理,Linux系统用户组的管理

      一.Linux 文件与目录管理 我们知道Linux的目录结构为树状结构,最顶级的目录为根目录 /. 其他目录通过挂载可以将它们添加到树中,通过解除挂载可以移除它们. 在开始本教程前我们需要先知道什 ...

  5. ping命令知识 Ping命令工作原理详解

    在网络应用中,ping网速与IP地址等都是非常常用的命令,但大家知道ping命令的工作原理吗?要知道这其中的奥秘,我们有必要来看看Ping命令的工作过程到底是怎么样的.下面介绍下ping命令的详细知识 ...

  6. linkbutton组件

    可独立存在的组件. inkbutton 按钮组件 通过$.fn.linkbutton.defaults重写默认的defaults链接按钮(linkbutton)用于创建一个超链接按钮.它是一个正常的& ...

  7. SpringInAction--Bean自动装配的歧义性处理

    在前面,学习如何装配Bean的时候,或许会发现,有的同类型的Bean智能配置一个 如下: package com.bean.java; import org.springframework.conte ...

  8. C语言学习之指针

    指针这块,看了好久才有点头绪,稍微有点理解了. 一.指针申明以及赋值 int *p; 这样就声明了一个int型的指针p,这个p就是指针变量,可能上述的书写方式会混淆我们队指针的理解(*号) 我们可以这 ...

  9. EventUtil对象

    var EventUtil = { addHandler : function(element,type,handler){ if(element.addEventListener){ element ...

  10. Kafka消费者生产者实例

    为了更为直观展示Kafka的消息生产消费的过程,我会从基于Console和基于Application两个方面介绍使用实例.Kafka是一个分布式流处理平台,具体来说有三层含义: 它允许发布和订阅记录流 ...