利用C语言编译器生成dll供其他软件调用

By admin at 2017-12-10 • 0人收藏 • 572人看过

示例:有一个东西需要由输入的数值来计算出相应的位移变化量, 思路是:生成两个函数调用,一个init初始化参数,一个calc计算输出.

//生成DLL 
 
code = /** 
    #include <stdio.h>
    #include <math.h>
     
    //默认值
    double dataR = 0.0;
    double dataX1 = 0.0;
    double dataX2 = 0.0;
    double dataY = 0.0;
     
    __declspec(dllexport) void uVwInit( double dR,double dx1,double dx2,double dy ) 
    {     
        dataR = dR;
        dataX1 = dx1;
        dataX2 = dx2;
        dataY = dy;
    } 
 
    __declspec(dllexport) void uVwCalc( double angle,double* dx1,double* dx2,double* dy ) 
    {     
        *dx1 = dataR * cos(( angle + dataX1 ) * 3.1415926 / 180 ) - dataR * cos( dataX1 * 3.1415926 / 180 );
        *dx2 = dataR * cos(( angle + dataX2 ) * 3.1415926 / 180 ) - dataR * cos( dataX2 * 3.1415926 / 180 );
        *dy = dataR * sin(( angle + dataY ) * 3.1415926 / 180 ) - dataR * sin( dataY * 3.1415926 / 180 );
    }  
**/
  
import tcc; 
vm = tcc( );//创建编译器 
vm.addLib( 
    "user32",
    "kernel32",
    "gdi32"
) 
vm.output( "/uVwCalc.dll", code ) //编译C源码,生成DLL
vm.close(); //收工
 
import console;
console.open()
//加载生成的DLL
var dll = raw.loadDll( "/uVwCalc.dll",,"cdecl");
 
//导入API,记住第二个参数需要指定cdecl调用约定(也就是C语言调用约定)
uVwInit = dll.api( "uVwInit","void(double dataR,double dataX1,double dataX2,double dataY)" );
uVwCalc = dll.api( "uVwCalc","void(double angle,double& dx1,double& dx2,double& dy)" ); 
 
uVwInit(53.74,45,315,225);//调用初始化
 
 var stx1,stx2,sty ;
 var s1,s2,s3 = uVwCalc(1,0,0,0);
 console.log( s1,s2,s3 );
 var s1,s2,s3 = uVwCalc(2,0,0,0);
 console.log( s1,s2,s3 );
  
console.pause();

生成了dll之后如果要给labview调用,最好是写一个h头文件.格式如下:

/*
---------------------------------------------------------------
文件名称:uVwCalc.h
---------------------------------------------------------------
*/
#ifdef UVWCALC_EXPORTS
#define UVWCALC_API __declspec(dllexport)
#else
#define UVWCALC_API __declspec(dllimport)
#endif
 
#ifdef __cplusplus
extern "C" {
#endif
/*****************************************************
*函数名称:uVwInit
*输    入:dR  通过连接在个周四的交叉滚柱轴承中心的假设圆半径(mm)
          dx1 连接在X1轴上的交叉滚柱轴承中心的角度位置(mm)
          dx2 连接在X2轴上的交叉滚柱轴承中心的角度位置(mm)
          dy  连接在Y轴上的交叉滚柱轴承中心的角度位置(mm)
*输    出:空
*功    能:初始化UVW位置参数
*示    例:初始化为120平台参数
void  uVwInit( 53.74 , 45 , 315 , 225 );
******************************************************/
UVWCALC_API
extern void  uVwInit (double dR,double dx1,double dx2,double dy);
/*****************************************************
*函数名称:uVwCalc
*输    入:angle 移动角度
*输    出:dx1 X1轴的相对进给量(mm)
          dx2 X2轴的相对进给量(mm)
          dy  Y轴的相对进给量(mm)
*功    能:计算UVW平台各轴进给量
*示    例:移动3.2度
double* dx1;
double* dx2;
double* dy;
void  uVwCalc(3.2,dx1,dx2,dy);
******************************************************/
UVWCALC_API
extern void uVwCalc( double angle,double* dx1,double* dx2,double* dy );
 
#ifdef __cplusplus
}
#endif


1 个回复 | 最后更新于 2017-12-30
2017-12-30   #1
code = /** 
	#include <windows.h>
	 
	typedef HWND WINAPI (*CreateWindowExPtr)(
			DWORD     dwExStyle,
			LPCWSTR   lpClassName,
			LPCWSTR   lpWindowName,
			DWORD     dwStyle,
			int       x,
			int       y,
			int       nWidth,
			int       nHeight,
			HWND      hWndParent,
			HMENU     hMenu,
			HINSTANCE hInstance,
			LPVOID    lpParam
	);
	
	static CreateWindowExPtr pCreateWindowEx;
	static HWND hwndParent;
	static UINT wm_aardio_electron;
	
	__declspec(dllexport) void SetCreateWindowExPtr( CreateWindowExPtr p,HWND hwnd,UINT msg ){
		hwndParent = hwnd;
		pCreateWindowEx = p;
		wm_aardio_electron = msg;
	}
	
	__declspec(dllexport) HWND WINAPI CreateWindowExHook(
			DWORD     dwExStyle,
			LPCWSTR   lpClassName,
			LPCWSTR   lpWindowName,
			DWORD     dwStyle,
			int       x,
			int       y,
			int       nWidth,
			int       nHeight,
			HWND      hWndParent,
			HMENU     hMenu,
			HINSTANCE hInstance,
			LPVOID    lpParam
	){
		HWND hwnd = pCreateWindowEx(dwExStyle,lpClassName,lpWindowName,dwStyle,x,y,nWidth,nHeight,hWndParent,hMenu,hInstance,lpParam); 
		SendMessage(hwndParent,wm_aardio_electron, 0,hwnd);
		return hwnd;
	}
**/
 
import tcc; 
vm = tcc( );//创建TCC编译器 

/*
加载需要用到的动态库,或静态库
在"~\lib\tcc\.res\lib" 目录下查找 "动态库名.def" "静态库名.a"
也可以使用 vm.addLibPath() 函数添加搜索库的目录
*/
vm.addLib( 
	"user32",
	"kernel32",
	"gdi32"
) 

vm.addFile("/CreateWindowExHook.def")
vm.output( "~\lib\electron\.build\CreateWindowExHook.dll", code ) //编译C源码,生成DLL
vm.close(); //收工

import win;
win.msgbox("CreateWindowExHook编译成功")


登录后方可回帖

登 录
信息栏
本站永久域名:HtmLayout.Cn
纯私人站,当笔记本用的,学到哪写到哪,目前正在学aardio+halcon机器视觉.
Sciter中文在线文档Sciter在线学习文档
本 站 主 站:Stm32cube中文网
Aardio 官方站:Aardio官方
Aardio最新功能:Aardio官方更新日志
aardio在线手册Aardio在线手册
C大Aardio论坛:Aar爱好者论坛
简码教程网:简码编程
AARDIO语言QQ群:70517368
赞助商:才仁机械
下载站:非凡软件站
Loading...