在ActiveX控件中如何动态调用DLL函数

2023-11-15

 

 

刚到公司不久,接到领导的下达的一个任务,就是把对POS机操作功能封装在ActiveX控件中在IE中调用。这样就能实现在IE上直接对POS机进行操作。而我要封装的这个动态库,厂家只提供了一个单的动态库和一百多字的说明,也就是说明一下动态库中有机个函数和其对应的参数。也就是厂家就连动态库对应的头文件也没有提供。:-( 这样也行?!

接到这个任务后,我第一想到的是用VC的ATL来实现它。你问我为什么要用ATL也不用别的,如CB、Delphi之类的。我只能说我觉得写ActiveX还是用VC好;况且还要对硬件进行操作,这样一来当然是用VC了。别说我没提醒你,用CB、Delphi之类的有可能会出现预想不到的惊奇......

现在让我带着进入正题吧!

1、先用ATL COM AppWizard生成一个名叫PosActiveX的工程,生成时系统会问你是生成DLL还是EXE。当然是DLL的了。

2、生成好后加入一个接口叫IPosCtrl,当然了要在Web上用,所以生成的接口一定是要小所以选择Lite Control的。你可别问我怎么加入,如果这都不会,那我写的这文章是不适合你看的。所以等你学会加入接口后再看。接口加好后,我就要实现方法了。

首先用接口一般都要对其进行初始化。所以加入一个叫Init(short nCom)的接口方法,该方法完成加载DLL和DLL中的功能函数,还有就是打开对POS机进行操作的COM口;

还有一个是修改POS机的时间的方法叫ModifyPosDT(BSTR bstrDT);

还有个是清空POS机中数据的方法--EmptyPos();

最后,当你不想用时就要关闭所打开的COM口--Quit()。

在生成接口IPosCtrl时同时会生成CPosCtrl类。我有个习惯,就是我一般是把实现方法都写在类中,而接口只时输出该类中你想输出的方法。所以在类中我就写了以下几个方法:

InitDll()----加载DLL库和其中的功能函数;

ExitDll()----卸载DLL库,用完后不卸载是在占用内存。所以它是少不了的。

SetPosDateTime(char * pchDT)---设置POS机的时间。

ClearPos()----清空POS机中的记录。

在类中我就写了这几个方法。

在说一下我要输出的接口方法有:

Init(short nCom)----初化接口,为调用做准备。

Quit()----退出程序时,调用它退出接口调用。

ModifyPosDT(BSTR bstrDT)----设置POS机时间。

EmptyPos()----清空POS机数据。

完了就这么多。

现在来看看我的源程序吧!

// PosCtrl.cpp : Implementation of CPosCtrl

#include "stdafx.h"
#include "PosActiveX.h"
#include "PosCtrl.h" //--------------------------------------------------------
// Police.dll所用到的常量定义
//-------------------------------------------------------- #define Com_UpRecord 1
#define Com_UpPoliceLen 2
#define Com_UpSimpleDataLen 3
#define Com_UpSimplePunishLen 4
#define Com_UpGeneralDataLen 5
#define Com_UpGeneralPunishLen 6

#define Com_EmptyPolice 7
#define Com_EmptySimpleData 8
#define Com_EmptySimplePunish 9
#define Com_EmptyGeneralData 10
#define Com_EmptyGeneralPunish 11

#define Com_DownRecord 0x80
#define Com_DownStreetCodeLen 0x81
#define Com_DownBlackListLen 0x82
#define Com_DownPeccancySimpleLen 0x83
#define Com_DownPeccancyGeneralLen 0x84
#define Com_DownDateTime 0x85
#define Com_Exit 0x86
#define Com_Init 0x87

#define Err_UpSimpleDataLen 0
#define Err_UpSimplePunishLen 1
#define Err_UpGeneralDataLen 2
#define Err_UpGeneralPunishLen 3
#define Err_UpPoliceLen 4
#define Err_UpRecord 5
#define Err_DownStreetCodeLen 6
#define Err_DownSimplePeccancyCodeLen 7
#define Err_DownGeneralPeccancyCodeLen 8
#define Err_DownBlackList 9
#define Err_DownDateTime 10
#define Err_EmptyData 11
#define Err_GetCode 12;

#define Const_Terminator 0x20

#pragma data_seg("mydata") 

static HINSTANCE DLLInst = NULL; //动态库句柄

#pragma data_seg() //

HANDLE hCom; //COM串口句柄 //------------------------------------------------------
//POLICE.DLL动态库函数功能定义
//------------------------------------------------------ HANDLE (__stdcall *Init_comm)(LPSTR str);//初始化通信口
BYTE (__stdcall *Exit)(HANDLE hCom);//关闭通信口
BYTE (__stdcall *Protocol)(HANDLE hCom,BYTE cmd,BYTE len,BYTE *_dt,BYTE *prlen,BYTE *prdt);//通信协议
BYTE (__stdcall *Pipe_control)(HANDLE hCom,BYTE mode);//多路控制typedef
BYTE (__stdcall *Dev_escape)(HANDLE hCom);//断开多路控制


 

//----------------------------------------------------------------------------// 

// 功能:加载Police.dll动态库和其中的一些功能函数 

// 输入/输出参数:无 

// 版本:1.0 

// 修改: 

//----------------------------------------------------------------------------// 
void CPosCtrl::InitDll()
{
	DLLInst=LoadLibrary("police.dll");
	if(DLLInst!=NULL)
	{
		Init_comm=(HANDLE(__stdcall *)(LPSTR))GetProcAddress(DLLInst,"Init_comm");
		Exit=(BYTE(__stdcall *)(HANDLE))(GetProcAddress(DLLInst,"Exit"));
		Protocol=(BYTE(__stdcall *)(HANDLE,BYTE,BYTE,BYTE *_dt,BYTE *prlen,BYTE *prdt))(GetProcAddress(DLLInst,"Protocol"));
		Pipe_control=(BYTE(__stdcall *)(HANDLE,BYTE))(GetProcAddress(DLLInst,"Pipe_control"));
		Dev_escape=(BYTE(__stdcall *)(HANDLE))(GetProcAddress(DLLInst,"Dev_escape"));
	}
	else
	{
		::MessageBox(NULL,"加载动态库失败!", "提示信息", MB_OK | MB_ICONINFORMATION);
		exit(0);
	}
}


 

//----------------------------------------------------------------------------// 

// 功能:加载Police.dll动态库和其中的一些功能函数 

// 输入/输出参数:无 

// 版本:1.0 

// 修改: 

//----------------------------------------------------------------------------// 
void CPosCtrl::InitDll()
{
	DLLInst=LoadLibrary("police.dll");
	if(DLLInst!=NULL)
	{
		Init_comm=(HANDLE(__stdcall *)(LPSTR))GetProcAddress(DLLInst,"Init_comm");
		Exit=(BYTE(__stdcall *)(HANDLE))(GetProcAddress(DLLInst,"Exit"));
		Protocol=(BYTE(__stdcall *)(HANDLE,BYTE,BYTE,BYTE *_dt,BYTE *prlen,BYTE *prdt))(GetProcAddress(DLLInst,"Protocol"));
		Pipe_control=(BYTE(__stdcall *)(HANDLE,BYTE))(GetProcAddress(DLLInst,"Pipe_control"));
		Dev_escape=(BYTE(__stdcall *)(HANDLE))(GetProcAddress(DLLInst,"Dev_escape"));
	}
	else
	{
		::MessageBox(NULL,"加载动态库失败!", "提示信息", MB_OK | MB_ICONINFORMATION);
		exit(0);
	}
}
//----------------------------------------------------------------------------// 

// 功能:释放动态库 

// 输入/输出参数:无 

// 版本:1.0 

// 修改: 

//----------------------------------------------------------------------------// 

void CPosCtrl::ExitDll()
{
	if(DLLInst!=NULL)
		FreeLibrary(DLLInst);
}
//----------------------------------------------------------------------------// 

// 功能:控件接口方法,对外提供关闭串口,释放动态库。 

// 输入/输出参数:无 // 版本:1.0 

// 修改: 

//----------------------------------------------------------------------------// 
STDMETHODIMP CPosCtrl::Quit()
{
	// TODO: Add your implementation code here

	(*Exit)(hCom);
	ExitDll();
	::MessageBox(NULL,"关闭COM口成功","提示信息",MB_OK | MB_ICONINFORMATION);
	return S_OK;
}

STDMETHODIMP CPosCtrl::get_ComNo(short *pVal)
{
	// TODO: Add your implementation code here
	*pVal = m_ComNo;
	return S_OK;
}

STDMETHODIMP CPosCtrl::put_ComNo(short newVal)
{
	// TODO: Add your implementation code here
	m_ComNo = newVal;
	return S_OK;
}
//----------------------------------------------------------------------------// 

// 功能:提供初化动态库的对外接口,并实现打开口串口的功能。 

// 输入/输出参数:11--要打开的串口号。 

// 版本:1.0 

// 修改: 

//----------------------------------------------------------------------------// 
STDMETHODIMP CPosCtrl::Init(short nComNo)
{
	// TODO: Add your implementation code here

	InitDll();
	char str[20] = "";
	sprintf(str,"COM%d",nComNo);
	hCom = (*Init_comm)((LPSTR)str);
	sprintf(str,"%d",hCom);
	char temp[255] = "";
	strcpy(temp,"打开的端口为COM1,句柄为:");
	strcat(temp,str);
	::MessageBox(NULL,temp,"提示信息",MB_OK | MB_ICONINFORMATION);
	//TCHAR str[255];
	//sprintf(str,"%d",hCom);
	//MessageBox(str,"Caption",MB_OK);
	return S_OK;
}
//----------------------------------------------------------------------------//
// 功能:实现ASCII码到BCD码的转换功能函数
// 输入/输出参数:11-想转换的ASCII码,22-返回的BCD码,13-ASCII码的长度,14-返回的BCD码长度
// 版本:1.0
// 修改:
//----------------------------------------------------------------------------// 
void CPosCtrl::ASCII_TO_BCD(char *cSource, char *cResult, int iSourceLen, int iResultLen)
{
	int iBegin,i;
	iBegin=0;
	if(iSourceLen%2)
	{
		iBegin=1;
		cResult[0]=cSource[0]-''0'';
	}
	for (i=iBegin;i< iResultLen;i++)
	{
		cResult[i]=(cSource[2*i-iBegin]-''0'')*16+cSource[2*i-iBegin+1]-''0'';
	}
	//deprive off preData
	cResult[iResultLen]=''\0'';
}
//----------------------------------------------------------------------------//

// 功能:设置POS机时间函数。

// 输入/输出参数:11-想要设置的时间

// 版本:1.0

// 修改:

//----------------------------------------------------------------------------// 

BOOL CPosCtrl::SetPosDateTime(char * pchDateTime)
{
	int n=1;
	unsigned char cInput[257],cOutput[256];
	BYTE byOutput,retVal;
	for(int i=0;i<8;i++)
	{

		(*Pipe_control)(hCom,n); //多路控制
		//修改POS机时间
		{
		if(::MessageBox(NULL,"是否确定修改POS机时间?","提示信息",MB_YESNO)==IDNO)
		{
			return FALSE;
		}

		ASCII_TO_BCD(pchDateTime,(char *)cInput,10,5);
		retVal = (*Protocol)(hCom,Com_DownDateTime,5,cInput,&byOutput,cOutput);
		if (retVal)
		{
			::MessageBox(NULL,"修改成功!","提示信息",MB_OK | MB_ICONINFORMATION);
		}
		else
		{
			::MessageBox(NULL,"修改不成功!","提示信息",MB_OK | MB_ICONINFORMATION);
		}
		}

		n=n<<1 ;
	}
	(*Protocol)(hCom,0x86,5,cInput,&byOutput,cOutput); //下载成功
	(*Dev_escape)(hCom); //关闭多路控制
	(*Pipe_control)(hCom,0); //多路控制复位
	return TRUE;
}
//----------------------------------------------------------------------------//

// 功能:对外提供的修改时间的接口方法

// 输入/输出参数:11-想要设置的时间

// 版本:1.0

// 修改:

//----------------------------------------------------------------------------// 

STDMETHODIMP CPosCtrl::ModifyPosDT(BSTR bstrDT)
{
	// TODO: Add your implementation code here
	if(SetPosDateTime((char *)bstrDT))
	{
		return S_OK;
	}
	{
		return S_FALSE;
	}
}
//----------------------------------------------------------------------------//

// 功能:实现清空POS机内数据的函数。

// 输入/输出参数:无

// 版本:1.0

// 修改:

//----------------------------------------------------------------------------// 

void CPosCtrl::ClearPos()
{
	int n=1;
	unsigned char cInput[257],cOutput[256];
	BYTE byOutput,retVal;
	for(int i=0;i<8;i++)
	{

		(*Pipe_control)(hCom,n); //多路控制
		//清空POS机内的数据

		if(::MessageBox(NULL,"是否要清空POS机内数据?","提示信息",MB_YESNO | MB_ICONQUESTION)==IDNO)
		{
			return;
		}
		retVal = Protocol(hCom,7,1,cInput,&byOutput,cOutput); //通信协议
		if (!retVal)
		{
			retVal = Protocol(hCom,8,1,cInput,&byOutput,cOutput);
			if (!retVal)
			{
				retVal = Protocol(hCom,9,1,cInput,&byOutput,cOutput);
				if (!retVal)
				{
					retVal = Protocol(hCom,10,1,cInput,&byOutput,cOutput);
					if (!retVal)
					{
						retVal = Protocol(hCom,11,1,cInput,&byOutput,cOutput);
					}
				}
			}
			::MessageBox(NULL,"POS机内数据已被清空!","提示信息",MB_OK | MB_ICONINFORMATION);
		}
		n=n<<1 ;
	}

	(*Protocol)(hCom,0x86,5,cInput,&byOutput,cOutput); //下载成功
	(*Dev_escape)(hCom); //关闭多路控制
	(*Pipe_control)(hCom,0); //多路控制复位
	return;
}
//----------------------------------------------------------------------------//

// 功能:对外提供的清空POS机内数据的接口方法

// 输入/输出参数:无

// 版本:1.0

// 修改:

//----------------------------------------------------------------------------// 

STDMETHODIMP CPosCtrl::EmptyPos()
{
	// TODO: Add your implementation code here
	ClearPos();
	return S_OK;
}


 

下面是调用PosActiveX.Dll的效果,调用时,要先对其进行注册,否则调用是不会成功的.注册是在"Windows的开始菜单中调用"运行",在"运行"对话框中输入:regsvr32 C:\PosActiveX\PosActiveX.dll 注册成功后就可对COM口进行操作了。还有一点是要特别注意的,必须把你要在ActiveX控件调用的Dll文件拷贝到Windows\System目录(对于Win9x系统),对于NT,2000系统就要拷贝到WINNT\System32目录下才能正确的运行。

开发环境:Windows2000和VC6

测试环境:Windows200

代码使用许可:可用

 

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在ActiveX控件中如何动态调用DLL函数 的相关文章

  • 检测反射 DLL 注入

    在过去的几年中 恶意软件 以及一些渗透测试工具 如 Metasploit 的 meterpreter 负载 已经开始使用反射 DLL 注入 PDF http www harmonysecurity com files HS P005 Ref
  • 如何安全地将对象(尤其是 STL 对象)传入和传出 DLL?

    如何将类对象 尤其是 STL 对象 传入和传出 C DLL 我的应用程序必须以 DLL 文件的形式与第三方插件交互 并且我无法控制这些插件是使用什么编译器构建的 我知道 STL 对象没有保证的 ABI 并且我担心这会导致我的应用程序不稳定
  • 在 Delphi 2009 上安装最新版本的 Indy 10 [重复]

    这个问题在这里已经有答案了 是否有更新 Delphi 2009 中的 Indy 10 组件的分步指南 我读过正在卸载线程 https stackoverflow com questions 486210 what is the proper
  • 如何删除非空约束?

    假设创建了一个表 如下所示 create table testTable colA int not null 您将如何删除非空约束 我正在寻找类似的东西 ALTER TABLE testTable ALTER COLUMN colA DRO
  • 为单个方法引用大 DLL

    我想在 C 中使用大型类库 dll 中的单个方法 是否有性能或其他方面的缺点 我应该使用反射工具 读取 方法代码并将其复制粘贴到我的项目中吗 更新 硬盘空间不是问题 我的应用程序是网络应用程序 是否有性能或其他方面的缺点 唯一真正重要的是可
  • SidBySide:3rd Party Dll 指的是 MSVCR80.DLL 的两个版本

    我们包含了一个 3rd Party lib DLL 最近在安装时造成了很多麻烦 使用依赖步行者 http www dependencywalker com 我们发现dll本身引用了两个不同版本的 MSVCR80 DLL Version 8
  • 在java程序中使用c++ Dll

    我正在尝试使用System LoadLibrary 使用我用 C 编写的一个简单的 dll UseDllInJava java import com sun jna Library import com sun jna Native imp
  • 从 Delphi 调用 C# dll

    我用单一方法编写了 Net 3 5 dll 由Delphi exe调用 不幸的是它不起作用 步骤 1 使用以下代码创建 C 3 5 dll public class MyDllClass public static int MyDllMet
  • 如何释放 TInterfacedObject 中的 TObject 成员

    我知道接口对象是引用计数的 因此不需要手动释放它 但如果它有一个 TObject 继承成员 我是否应该在析构函数中手动释放该成员 考虑以下代码 program Project2 APPTYPE CONSOLE R res uses Syst
  • 在 C# 中使用“C”dll [重复]

    这个问题在这里已经有答案了 可能的重复 如何从 C ASP NET 网页调用非托管 C C 代码 https stackoverflow com questions 720004 how do i call unmanaged c c co
  • 打印 TDBGrid [重复]

    这个问题在这里已经有答案了 如何在不安装或下载组件的情况下打印 DBGrid OR 如何将 DBGrid 的数据放入 RichEdit 以便我可以从那里打印它 数据感知控件从 DataSource 属性获取数据 并使用它 不过 您必须手动遍
  • 无法在 JavaScript for 循环中读取 null 的属性“长度”

    我正在尝试制作一个像 Stack Overflow 那样的 Markdown 编辑器 如果我实际上没有在文本区域中键入星号和包含短语的 http 我会收到标题中列出的此错误 如果我只输入包含星号的短语 则错误指的是这一行 if linkif
  • C# 中 DLL 和命名空间的关系

    这里有一个高级问题 今天我花了很多时间自学基本的高级概念 例如 API 静态和动态库 DLL 以及 C 中的编组 获得所有这些知识让我想到了一个看起来非常基本的问题 并且可能表明我对这些概念的理解存在漏洞 我知道的 DLL 可能包含类 这些
  • Delphi中使用FindVCLWindow调用WinHelp32(WinXP Pro SP3 32bit)

    有什么问题吗 procedure TForm1 VCLHelpClick Sender TObject var Ctrl TWinControl begin Ctrl FindVCLWindow Mouse CursorPos if Ctr
  • 从 Delphi VCL 样式获取特定字形

    我想从 VCL 样式获取特定的位图 并将其设置为按钮上的图像 它实际上是帮助问号 在位图样式编辑器中是来自表单的 btnHelp 图像 要从 VCL 样式获取视觉元素 字形 您必须使用GetElementDetails和TCustomSty
  • VB - 以隐式方式链接 DLL

    我正在开发 VB6 图形界面 并且需要隐式链接到 DLL 这样做的动机来自于我上一个问题 https stackoverflow com questions 5194573 有问题的 DLL 使用静态 TLS declspec thread
  • 尝试用 C# 创建数学输入面板

    如何在 C 中创建数学输入面板 我尝试将其放入 dll 中并调用它 但它立即关闭 include
  • 如何测试 UITextField 是否为零?

    我正在尝试制作我的应用程序的一部分 如果该人不更改我的 UITextField 中的空白文本 那么他 她将无法继续下一步 基本上 我想测试 UITextField 的 nil 文本 我已经使用了 if text 方法 但是如果用户单击 UI
  • 使用 PutBlock 并将字节数组全部设置为零的 EIPHTTPProtocolExceptionPeer 异常

    使用 Delphi XE2 Update 3 我在将零字节块上传到 Azure 时遇到问题 当我说零字节时 我指的是每个元素设置为零的字节数组 不是零长度 例如 var ConInfo TAzureConnectionInfo RespIn
  • 检测到严重错误 c0000374 - C++ dll 将已分配内存的指针返回到 C#

    我有一个 c dll 它为我的主 c 应用程序提供一些功能 在这里 我尝试读取一个文件 将其加载到内存 然后返回一些信息 例如加载数据的指针和内存块的计数到 c Dll 成功将文件读取到内存 但在返回主应用程序时 程序由于堆损坏而崩溃 检测

随机推荐

  • [春秋云镜]CVE-2022-23316

    声明 中所涉及的技术 思路和 具仅供以安全为 的的学习交流使 任何 不得将其 于 法 途以及盈利等 的 否则后果 承担 所有渗透都需获取授权 靶场介绍 taoCMS v3 0 2 存在任意文件读取漏洞 春秋云镜开启靶场 http eci 2
  • highcharts学习

    学习中
  • MySQL中general日志定时切割

    创建历史日志保存目录 data log hislog 准备日志切割脚本 more home mysql scripts cut general log sh bin bash setEnv USER root USER PWD 123456
  • 【webgl学习二】&顶点着色器、片元着色器

    按照 webgl编程指南 学习着色器 webgl分为两种着色器 顶底着色器 片元着色器 顶点着色器 描述顶点的特性 位置 颜色等 的程序 顶点 二维 三维空间的点 图形的端点或交点 片元着色器 进行着片元处理过程的程序 着色器使用类似c语言
  • linux日志管理工具logrotate配置

    linux日志管理工具logrotate配置 logrotate介绍 logrotate配置讲解 主配置文件解释 etc logrotate conf logrotete 命令参数 添加配置 以添加一个nginx配置为例 强制启动配置 lo
  • 蜜罐技术

    前言 之前一直就有听说过蜜罐 蜜罐的 不知道是什么技术 今天在公司看到一份资料算是基本弄清楚了 和大家分享一下 何为蜜罐 Honeypot 蜜罐 Honeypot 这一概念最初出现在1990 年出版的一本小 TheCuckoo sEgg 中
  • 【论文阅读】Dimensionality Reduction by Learning an Invariant Mapping

    1 背景 对比学习算是比较早就已经提出了一种技术 其中 早期比较有名的一篇文章就是Lecun等在 Dimensionality Reduction by Learning an Invariant Mapping 简称 DrLIM 文章中提
  • IKE 协议(转)

    from http lulu1101 blog 51cto com 4455468 817872 IKE 协议 2012 03 26 21 49 50 标签 休闲 ike 职场 IKE 协议简介 1 IKE 协议 IPSec 的安全联盟可以
  • K8S 工作负载(一)

    K8S 工作负载 1 Pod Pod 是 Kubernetes 中创建 管理和调度的最小计算单元 用户可以在 K8S 中通过调用 Pod API生成一个 Pod 让 K8S 对其进行调度 Pod 是一组 一个或多个 容器 这些容器共享存储
  • 实现基于DR模型的LVS

    环境 client 桥接 router 桥接 vmnet8 ip forward LVS vmnet8 rs1 rs2 vmnet8 GATE XXXX
  • strongswan介绍

    文章目录 保障网络安全 IKE和IPsec基础 认证基础知识 配置文件基础 使用和维护 日志和监测 PKI 路由 strongswan介绍文档翻译 原文链接 保障网络安全 strongswan是一套完整的IPsec实现方案来提供服务端和客户
  • Pytorch学习笔记(16)———预训练模型微调

    完整工程 工程目录结构 Code import torch import torch optim as optim import torch nn as nn from torch utils data import DataLoader
  • 计算两幅图像的相似度(PSNR、SSIM、MSE、余弦相似度、MD5、直方图、互信息、Hash)& 代码实现 与举例

    MSE Mean Squared Error 均方误差 MSE公式 MSE 计算模型的预测 与真实标签 Y 的接近程度 公式表示为 对于两个m n的单通道图像I和K 它们的均方误差可定义为 优点 MSE的函数曲线光滑 连续 处处可导 便于使
  • Matlab从指定行读取文本文件(textscan)

    在帮助别人的同时提高自己 有人提到这个问题 给了我去探究的机会 将最终代码做一下记录 问题描述 现有一大矩阵存储于某一txt文件末端 需要用导入matlab进行进一步的处理 这就需要略过前面很多无效行 如果采用传统的fscanf未免有些麻烦
  • Oracle数据库查询最近一周的记录(后台时间存储类型为10位时间戳)

    现有一张SHOPPING表 记录最近的购物记录 包括商品名 金额 时间 以10位时间戳形式存储 为了更直观地了解时间信息 我们需要将10位时间戳转换成我们能够看懂的时间字符串 查询sql如下 SELECT NAME AMOUNT CDATE
  • Python 搭建虚拟环境

    简介 实际开发中 我们为了防止python安装的包污染用户环境 比如你是root用户 利用pip安装后的包会放在root的python安装录中 很可能会影响root用户的其他操作 我们用root用户使用pip安装软件包后 linux环境会报
  • Django2.0-templates(1)-渲染模版方式和模版查找路径

    templates Django自带的是DTL Django Templates language DTL模版是一种带有特殊语法的HTML文件 该文件可以被Django编译 可以传递参数进去 实现数据动态化 编译完成后 生成一个普通的HTM
  • 如何安装elasticsearch分布式搜索引擎

    文章目录 安装elasticsearch 1 部署单点es 1 1 创建网络 1 2 下载镜像 1 3 运行 2 部署kibana 2 1 部署 2 2 安装中文 2 3 DevTools 3 安装IK分词器 3 1 在线安装ik插件 较慢
  • MQL5:zig-zag 指标

    Zig Zag 指标是用于描述高低点趋势的指标 MQL5 官方实现 MQL5 官方实现十分地烂 辣鸡 很多无用的变量 程序冗长 不一致 效率低下 感觉是多个菜鸟合作写出来的 有一些没有用的变量都没有删掉 不过 先来看看MQL5的官方实现 辅
  • 在ActiveX控件中如何动态调用DLL函数

    刚到公司不久 接到领导的下达的一个任务 就是把对POS机操作功能封装在ActiveX控件中 在IE中调用 这样就能实现在IE上直接对POS机进行操作 而我要封装的这个动态库 厂家只提供了一个单的动态库和一百多字的说明 也就是说明一下动态库中