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

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

示例:有一个东西需要由输入的数值来计算出相应的位移变化量, 思路是:生成两个函数调用,一个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编译成功")


登录后方可回帖

登 录
信息栏
 私人小站

本站域名

ChengXu.XYZ

投诉联系:  popdes@126.com



快速上位机开发学习,本站主要记录了学习过程中遇到的问题和解决办法及上位机代码分享

这里主要专注于学习交流和经验分享.
纯私人站,当笔记本用的,学到哪写到哪.
如果侵权,联系 Popdes@126.com

友情链接
Aardio官方
Aardio资源网


才仁机械


网站地图SiteMap

Loading...