利用C语言编译器生成dll供其他软件调用
By
admin
at 2017-12-10 • 0人收藏 • 1636人看过
示例:有一个东西需要由输入的数值来计算出相应的位移变化量, 思路是:生成两个函数调用,一个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
登录后方可回帖
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编译成功")