“分析家C语言接口编译dll文件”
“分析家C语言接口编译dll文件”
![“分析家C语言接口编译dll文件”](https://img.taocdn.com/s3/m/6fbec5cc856a561252d36fbb.png)
“分析家C语言接口编译dll文件”[第一讲]准备的东东1.安装VC++ 6.0软件2.下载分析家C语言接口文件。
3.具备C++编程的知识。
如果不会,自己下载教学软件,或找本相关的书籍。
4.会分析家基本公式编写。
如果不会,在本站下载相关分析家公式编写资料。
准备好后,我开始讲一个完整公式的编写过程。
[第二讲]练习编译dll文件。
1.解包分析家c语言接口2.启动Vc++点击菜单[File]选Open Workspace。
选择文件FxjFunc.dsw3.选择菜单[Build],选择Build FxjFunc.dll生成FxjFunc.dll文件。
如果没有错误,显示下面结果。
--------------------Configuration: FxjFunc - Win32 Debug-------------------- FxjFunc.dll - 0 error(s), 0 warning(s)4.生成的FxjFunc.dll文件在D:\SUPERSTK目录中。
如果不在当前使用的分析家目录,可以将FxjFunc.dll文件复制到分析家目录中,也可以复制到飞狐\FoxTrader\FmlDLL目录中。
5.在飞狐或分析家建立公式,看看结果。
公式只有下面一句,10日close均线。
ma1:"fxjfunc@mymaclose"(10); 如果结果正确,你已经成功编写了dll公式了。
在后面的讲课中介绍编写技巧。
第三讲]分析家扩展函数规范及设计分析家扩展函数规范如下:///////////////////////////////////////////////////////////////////////////#ifndef __FXJFUNC_H_INCLUDE#define __FXJFUNC_H_INCLUDE/*///////////////////////////////////////////////////////////////////////////分析家扩展函数规范V3.101.本规范适用于分析家3.10标准版和专业版公式系统.2.扩展函数用于实现系统函数不能实现的特殊算法.3.扩展函数用windows 32位动态连接库实现,建议使用Microsoft Visual C++编程.4.调用时在公式编辑器中写"动态库名称@函数名称"(参数表)即可,例如下面函数可以写为"FXJFUNC@MYCMALOSE"(5)5.动态连接库名称和函数名称可以自己定义.6.使用时可以将动态库拷贝到分析家目录下使用.*/#ifdef __cplusplusextern "C"{#endif //__cplusplus/////////////////////////////////////////////////////////////////////////// //分析周期enum DATA_TYPE{TICK_DATA=2, //分笔成交MIN1_DATA, //1分钟线MIN5_DATA, //5分钟线MIN15_DATA, //15分钟线MIN30_DATA, //30分钟线MIN60_DATA, //60分钟线DAY_DATA, //日线WEEK_DATA, //周线MONTH_DATA, //月线MULTI_DATA //多日线};/////////////////////////////////////////////////////////////////////////// //基本数据typedef struct tagSTKDATA{time_t m_time; //时间,UCTfloat m_fOpen; //开盘float m_fHigh; //最高float m_fLow; //最低float m_fClose; //收盘float m_fVolume; //成交量float m_fAmount; //成交额WORD m_wAdvance; //上涨家数(仅大盘有效)WORD m_wDecline; //下跌家数(仅大盘有效)} STKDATA;//////////////////////////////////////////////////////////////////////////// //扩展数据,用于描述分笔成交数据的买卖盘typedef union tagSTKDATAEx{struct{float m_fBuyPrice[3]; //买1--买3价float m_fBuyVol[3]; //买1--买3量float m_fSellPrice[3]; //卖1--卖3价float m_fSellVol[3]; //卖1--卖3量};float m_fDataEx[12]; //保留} STKDATAEx;///////////////////////////////////////////////////////////////////////////// /*财务数据顺序(m_pfFinData内容)序号内容0 总股本(万股),1 国家股,2 发起人法人股,3 法人股,4 B股,5 H股,6 流通A股,7 职工股,8 A2转配股,9 总资产(千元),10 流动资产,11 固定资产,12 无形资产,13 长期投资,14 流动负债,15 长期负债,16 资本公积金,17 每股公积金,18 股东权益,19 主营收入,20 主营利润,21 其他利润,22 营业利润,23 投资收益,24 补贴收入,25 营业外收支,26 上年损益调整,27 利润总额,28 税后利润,29 净利润,30 未分配利润,31 每股未分配,32 每股收益,33 每股净资产,34 调整每股净资,35 股东权益比,36 净资收益率*////////////////////////////////////////////////////////////////////////////////函数数据结构typedef struct tagCALCINFO{const DWORD m_dwSize; //结构大小const DWORD m_dwVersion; //调用软件版本(V2.10 : 0x210)const DWORD m_dwSerial; //调用软件序列号const char* m_strStkLabel; //股票代码const BOOL m_bIndex; //大盘const int m_nNumData; //数据数量(pData,pDataEx,pResultBuf数据数量)const STKDATA* m_pData; //常规数据,注意:当m_nNumData==0时可能为NULL const STKDATAEx* m_pDataEx; //扩展数据,分笔成交买卖盘,注意:可能为NULLconst int m_nParam1Start; //参数1有效位置const float* m_pfParam1; //调用参数1const float* m_pfParam2; //调用参数2const float* m_pfParam3; //调用参数3const float* m_pfParam4; //调用参数3float* m_pResultBuf; //结果缓冲区const DATA_TYPE m_dataType; //数据类型const float* m_pfFinData; //财务数据} CALCINFO;/*注:1.函数调用参数由m_pfParam1--m_pfParam4带入,若为NULL则表示该参数无效.2.当一个参数无效时,则其后的所有参数均无效.如:m_pfParam2为NULL,则m_pfParam3,m_pfParam4一定为NULL.3.参数1可以是常数参数或序列数参数,其余参数只能为常数参数.4.若m_nParam1Start<0, 则参数1为常数参数,参数等于*m_pfParam1;5.若m_nParam1Start>=0,则参数1为序列数参数,m_pfParam1指向一个浮点型数组, 数组大小为m_nNumData,数据有效范围为m_nParam1Start--m_nNumData.在时间上m_pData[x] 与m_pfParam1[x]是一致的*/////////////////////////////////////////////////////////////////////////////////////* 函数输出__declspec(dllexport) int xxxxxxxx(CALCINFO* pData); ---------- A__declspec(dllexport) int xxxxxxxxVAR(CALCINDO* pData); ---------- B1.函数名称需全部大写.2.函数必须以上述A,B两种形式之一声明,请用实际函数名称替代xxxxxxxx;对于C++程序还需包括在extern "C" { } 括号中.3.上述形式A用于声明不带参数或全部参数为常数的函数;形式B用于声明参数1为序列数的函数;两种函数的区别在于后者以VAR结尾.4.函数计算结果用pData->m_pResultBuf带回.5.函数返回-1表示错误或全部数据无效,否则返回第一个有效值位置,即:m_pResultBuf[返回值] -- m_pResultBuf[m_nNumData-1]间为有效值.6.函数名称长度不能超过15字节,动态连接库文件名不能超过9字节(不包括扩展名),动态库名称不能叫SYSTEM,EXPLORER7.编译时请请选择1字节对齐*///示例函数,使用时用实际名称替换__declspec(dllexport) int WINAPI MYMACLOSE(CALCINFO* pData);__declspec(dllexport) int WINAPI MYMAVAR(CALCINFO* pData);__declspec(dllexport) int WINAPI MYMACLOSE_CALC_PREV(CALCINFO* pData); __declspec(dllexport) int WINAPI MYMAVAR_CALC_PREV(CALCINFO* pData);#ifdef __cplusplus}#endif //__cplusplus#endif //__FXJFUNC_H_INCLUDE////////////////////////////////////////////////////////////////////////分析家的数据结构见上面。
C语言编译成dll
![C语言编译成dll](https://img.taocdn.com/s3/m/edc86aca6e1aff00bed5b9f3f90f76c661374cba.png)
C语⾔编译成dll
⾸先c语⾔在开始要加上
#ifdef __cplusplus
extern "C" {
#endif
…被导出的⽅法名称
#ifdef __cplusplus
}
#endif
不然系统会将起当做c++,转成的dll中的⽅法名称会被转义。
在实现的⽅法名称前⾯加上__declspec(dllexport)
1. Gcc:gcc –shared -o xxxx.dll xxxx.c 可以直接将.c⽂件转成dll⽂件。
在实际引⽤中,我是将所有的#include都是放在.c⽂件中的,上述的注意代码也是放在.c中的,他的头⽂件是直接抛弃掉了。
2. Vc创建⼀个c++的项⽬,⽂件-新建-新建项⽬-其他语⾔-Visual C++ - Win32 控制台应⽤程序;勾选DLL和导出符号,.c需要修改
成.cpp,右键-属性-预编译头-不使⽤预编译头,右击项⽬“重新⽣成”。
1实地使⽤过确认可以使⽤,2未尝试过但是在使⽤c++转出dll是没有问题的
在导出过程中我们可以使⽤vs⾃带⼀个⼯具来查询⽣成的dll中有那些⽅法,例如:
Vs安装路径下:C:\vs 2012\VC\bin\dumpbin.exe,可能会报⼀个缺少“mspdb110.dll”⽂件的错误,直接将安装路径下:C:\vs
2012\Common7\IDE下⾯的该⽂件复制粘贴到C:\vs 2012\VC\bin\下⾯。
⽤法是,先cd到dumpbin的路径下,dumpbin –exports xxxx.dll。
VS2010 环境下实现 C程序调用由 C 源代码编译得到的 DLL 文件
![VS2010 环境下实现 C程序调用由 C 源代码编译得到的 DLL 文件](https://img.taocdn.com/s3/m/3d1a6dfe0242a8956bece43a.png)
printf("max(%d, %d) = %d\n", a, b, fmax(a, b)); } } FreeLibrary(hLib);
return 0; }
注意以上源代码第 4 行中的标识符 __cdecl 开头是连续两个下划线。 输入源代码后的窗口如图 2.5 所示。然后按 Ctrl+Shift+S 组合键保存所有文件。
7
图 2.3 新建源文件 UseMax.c
图 2.4 空白的源代码编辑器窗口 4. 接上步,在源代码编辑器中输入以下源代码: #include<windows.h> #include<stdio.h> typedef int (__cdecl *FuncPtr)(int a, int b); int main(void) { FuncPtr fmax; HINSTANCE hLib; int a = 3, b = 4;
建项目”对话框中左侧选取“已安装的模板”——“其他语言”——“Visual C++” ——“Win32”,在中间区域点击“Win32 项目”,然后在名称栏中输入 max,并选 择合适的目录保存该项目的有关文件,如图 1.1 所示。然后取消勾选右下角的复选 框“为解决方案创建目录”,最后点击“确定”。
参考资料
1. VS2010 文档——Using Dynamic-Link Libraries
11
图 2.7 成功生成 Release 版的 UseMax.exe 文件 根据图 2.7 中的“输出”窗口的提示可知,已经在路径 D:\_Data\CMP\Lng\CLng\Programs\_CProject\UseMax\Release 下生成了程序 UseMax.exe。 7. 接上步,按 Ctrl+F5 组合键(或点击“调试”菜单下的“开始执行(不调试)”命令),
C#中修改Dll文件(反编译后重新编译)
![C#中修改Dll文件(反编译后重新编译)](https://img.taocdn.com/s3/m/4d3c1b8b82d049649b6648d7c1c708a1284a0a6d.png)
C#中修改Dll⽂件(反编译后重新编译)Dll⽂件⽣成后,如没有源代码,⼜要修改其中内容
可以⽤微软⾃带的ildasm和ilasm程序
先⽤ildasm将dll⽂件反编译成il⽂件
ildasm Test.dll /out=Test.il
会⽣成Test.res和Test.il两个⽂件
il⽂件可以⽤⽂本编辑器修改,要注意其中的语法
改完后再⽤ilasm将il⽂件重新编译成dll⽂件
ilasm /dll /res:Test.res Test.il /out:Test.dll
本⼈测试时因为ildasm和ilasm程序都是从⽹上下载来的,因为版本不⼀样,总是不成功,⾛了不少弯路
⽤这样⽅式修改唯⼀不⽅便的是il⽂件语法不好理解,⼀版修改少量的可以⽤,⼤量修改也不合适。
⽤Reflector将dll⽂件反编译成cs⽂件,也可以修改,这样好改,可是不好编译回去,有时会报错
所以选则⽤Reflector还是⽤ildasm和ilasm,更据需求各⾃选择。
c语言如何生成DLL文件
![c语言如何生成DLL文件](https://img.taocdn.com/s3/m/93ceb02a5a8102d276a22fc4.png)
DLLIMPORT void HelloWorld (void);
#endif /* _DLL_H_ */
C 文件 dllmain.c #include t;
DLLIMPORT void HelloWorld () {
MessageBox (0, "Hello World from DLL!\n", "Hi", MB_ICONINFORMATION); }
/*过程要带入的参数*/
LibHandle = LoadLibrary(dllbuf); /*载入 dll*/
FUNCADD = (MYFUNC)GetProcAddress(
LibHandle, sysbuf); /*获取函数 sysbuf 的地址*/
(FUNCADD) (NULL,downfile,savefile,0,NULL);
if (hDLL == NULL) hDLL=LoadLibrary("hello.dll"); //加载 DLL
hello = (func)GetProcAddress(hDLL,"HelloWorld"); //获取函数指针 hello(); FreeLibrary(hDLL); //释放 DLL return 0; }
开发环境是 DEV C++,采用 C 语言编写 创建一个 DLL 项目,项目名称 hello,DLL 编写采用的是 DEV C++中的示例代码
头文件 dll.h #ifndef _DLL_H_ #define _DLL_H_
#if BUILDING_DLL # define DLLIMPORT __declspec (dllexport) #else /* Not BUILDING_DLL */ # define DLLIMPORT __declspec (dllimport) #endif /* Not BUILDING_DLL */
反编译C#的dll文件并修改,再重新生成dll
![反编译C#的dll文件并修改,再重新生成dll](https://img.taocdn.com/s3/m/6951c710b42acfc789eb172ded630b1c59ee9bf6.png)
反编译C#的dll⽂件并修改,再重新⽣成dll
1、把dll⽂件导⼊到ildasm⼯具中,ildasm是由微软提供的.net程序反编译⼯具,位于“C:\Program Files (x86)\Microsoft
SDKs\Windows\v7.0A\Bin”
2、在ildasm中File->dump,把dll⽂件转储为*.il⽂件存到某个指定⽂件夹⾥,得到*.il和*.res两个⽂件,有时也会有*.resource⽂件
3、⽤记事本打开得到的*.il⽂件,找到对应的⽅法,进⾏修改(如果修改的代码太多,那则需要先学习⼀下“C#反编译之IL语法”),具体情况具体分析,修改之后保存。
4、打开DOS命令,进⼊到 c:\Windows\\Framework\v2.0.50727> ⽂件夹,然后输⼊命令:ilasm /dll/resource=a.res a.il(注意a.res和a.il两⽂件夹位置不可变),回车,就在对应⽬录下⽣成新的dll⽂件,如果不放⼼,可以⽤Refletor反编译⼯具重新反编译新的dll⽂件,检查代码。
c语言dll写法
![c语言dll写法](https://img.taocdn.com/s3/m/b438124cba68a98271fe910ef12d2af90342a85a.png)
c语言dll写法
在C语言中,编写DLL(动态链接库)的基本步骤如下:
1. 定义导出函数或变量:使用__declspec(dllexport)关键字将需要导出的函数或变量声明为导出符号。
例如:
```c
__declspec(dllexport) void MyFunction()
{
// 函数实现
}
```
2. 编译源代码:使用C编译器将源代码编译为目标文件。
例如,使用GCC 编译器可以使用以下命令:
```shell
gcc -c -DBUILD_DLL
```
这将生成一个名为的目标文件。
3. 创建DLL项目:使用链接器将目标文件链接为DLL。
例如,使用GCC编译器可以使用以下命令:
```shell
gcc -shared -o
```
这将生成一个名为的DLL文件。
4. 使用DLL:在其他C语言程序中,使用__declspec(dllimport)关键字导
入DLL中的导出符号。
例如:
```c
__declspec(dllimport) void MyFunction();
```
然后在程序中使用该函数或变量即可。
注意,在使用DLL时需要确保DLL
文件与应用程序位于同一目录中,或者在系统路径中添加DLL文件的路径。
以上是编写C语言DLL的基本步骤。
需要注意的是,具体的实现方式可能
会因编译器和操作系统而有所不同。
编写C语言DLL,及C调用DLL(VS2010)
![编写C语言DLL,及C调用DLL(VS2010)](https://img.taocdn.com/s3/m/515adbdbad51f01dc281f13a.png)
一、编写Dll文档1.新建一DLL项目dll2.#include"stdafx.h"#include"windows.h"#include"dll.h"#pragma comment(lib,"dll.lib")int _tmain(int argc, _TCHAR* argv[]){HelloWorld();return 0;}3.// dllmain.cpp : 定¡§义°? DLL 应®|用®?程¨¬序¨°的Ì?入¨?口¨²点Ì?。
¡ê#include"stdafx.h"#include"dll.h"#include<windows.h>#include<stdio.h>#include<stdlib.h>void HelloWorld (){MessageBox (0, L"Hello World from DLL!\n", L"Hi", MB_ICONINFORMATION);}BOOL APIENTRY DllMain (HINSTANCE hInst /* Library instance handle. */ ,DWORD reason /* Reason this function is beingcalled. */ ,LPVOID reserved /* Not used. */ ){switch (reason){case DLL_PROCESS_ATTACH:break;case DLL_PROCESS_DETACH:break;case DLL_THREAD_ATTACH:break;case DLL_THREAD_DETACH:break;}/* Returns TRUE on success, FALSE on failure */return TRUE;}4.生成菜单下的重新生成解决方案,即得到dll和lib文件,如图:至此DLL文件建立完成。
使用gcc编译出dll文件的方法
![使用gcc编译出dll文件的方法](https://img.taocdn.com/s3/m/e544effb998fcc22bcd10d72.png)
使用gcc编译出dll文件的方法我们通过实例来学习使用gcc编译出dll文件的方法,看下面的例子说明这个过程,共有三个文件:hello.c、dll.h和dll.c。
hello.c 文件内容如下#include <stdio.h>#include "dll.h"int main(){hello();return 0;}其中,hello()函数是动态连接库提供的函数。
dll.h 文件内容如下#ifdef BUILD_DLL#define EXPORT __declspec(dllexport)#else#define EXPORT __declspec(dllimport)#endifEXPORT void hello(void);dll.c 文件内容如下#include "dll.h"EXPORT void hello(void){printf ("Hello\n");}三个文件的内容都很简单,无须解释。
编译连接程序1、编译hello.cgcc -c hello.c2、编译dll.cgcc -c -DBUILD_DLL dll.c注意要使用要使用-DBUILD_DLL来设置宏BUILD_DLL3、创建dllgcc -shared -o message.dll dll.o -Wl,--out-implib,libmessage.a这一步要详细说明一下-shared参数用来创建共享库,在windows中为dll-Wl 等待下一条信息进行连接--out-implib是给连接程序ld使用的,用于创建要连接dll需要的import library 4、创建可执行文件gcc -o hello.exe hello.o -L./ -lmessage-L 指定连接库路径-lmessage (or -l message) 指定dll的import library好了,编译连接完成,运行程序C:\>helloHello!。
c++中.dll与.lib文件的生成与使用的详解
![c++中.dll与.lib文件的生成与使用的详解](https://img.taocdn.com/s3/m/d56821ff534de518964bcf84b9d528ea81c72f9e.png)
c++中.dll与.lib文件的生成与使用的详解--------------------------------------------------------------------------------两种库:·包含了函数所在的DLL文件和文件中函数位置的信息(入口),代码由运行时加载在进程空间中的DLL提供,称为动态链接库dynamic link library。
·包含函数代码本身,在编译时直接将代码加入程序当中,称为静态链接库static link library。
共有两种链接方式:·动态链接使用动态链接库,允许可执行模块(.dll文件或.exe 文件)仅包含在运行时定位DLL函数的可执行代码所需的信息。
·静态链接使用静态链接库,链接器从静态链接库LIB获取所有被引用函数,并将库同代码一起放到可执行文件中。
--------------------------------------------------------------------------------两种文件的区别--------------------------------------------------------------------------------使用lib需注意两个文件:·.h头文件,包含lib中说明输出的类或符号原型或数据结构。
应用程序调用lib时,需要将该文件包含入应用程序的源文件中。
·.LIB文件。
使用dll需注意三个文件:·.h头文件,包含dll中说明输出的类或符号原型或数据结构的.h文件。
应用程序调用dll时,需要将该文件包含入应用程序的源文件中。
·.LIB文件,是dll在编译、链接成功之后生成的文件,作用是当其他应用程序调用dll时,需要将该文件引入应用程序,否则产生错误(如果不想用lib文件或者没有lib文件,可以用WIN32 API函数LoadLibrary、GetProcAddress装载)。
利用C语言创建和使用DLL文件
![利用C语言创建和使用DLL文件](https://img.taocdn.com/s3/m/407b1d034b7302768e9951e79b89680203d86bcb.png)
利⽤C语⾔创建和使⽤DLL⽂件有感于讲C语⾔的DLL⽂件的⽂章很少,⾃⼰查了半天,写了这么个⾮常简单的教程。
⾃⼰也是摸C语⾔不久,依然感觉处于编程苦⼿的阶段。
1)为什么使⽤DLL⽂件C语⾔复⽤代码有很多的形式,利⽤动态链接库(DLL)来复⽤代码也是⼀种很有效的做法。
使⽤DLL相⽐利⽤静态库来复⽤代码有⼏点不同:a. 可以不⽤写 header File,但是在编译过程中需要在编译器⾥把⽂件链接起来;b. 更加灵活,可以只改动和编译DLL⽂件的内容,⽽不⽤对程序其他部分进⾏修改;c. 利⽤DLL⽂件可以⽅便地与其他语⾔进⾏链接(⽐如Python)。
2)创建DLL及C语⾔调⽤程序⽬前看来,创建 DLL ⽂件和创建普通c语⾔⽂件没有什么不同。
创建 C++ 的 DLL ⽂件要更复杂⼀些,C 则相对简单。
照着 C 代码的格式写⼀个⽂件(注:C++ 似乎会不同,微软就有教程,可以查阅VS的帮助⽂档)。
以下是⼀个实例,⽂件名为 TestDll.c//TestDll.c#include<</font>stdio.h>int hello(){printf ("Hello from DLL\n");}int SumNumbers(int a, int b){int c;c=a+b;return c;}然后写⼀个主程序来调⽤,⽂件名为 UseTestDll.c//UseTestDLL.c#include<</font>stdio.h>int main(){hello();hello();int a=2,b=3;int c;c=SumNumbers(a, b);printf ("c= %d.\n",c);}搞定。
3)编译及运⾏测试使⽤的是 MinGW 下的 gcc 编译器。
a. 编译 DLL ⽂件先将 c ⽂件编译成 o ⽂件,然后再讲 o ⽂件编译成为 DLL ⽂件,在 cmd ⾥⾯代码如下:gcc -c TestDLL.cgcc -shared -o TestDll.dll TestDll.o这样就得到了 TestDll.dll ⽂件,如果⽂件多的话可以写个Batch⽂件来搞定。
编译VC++类的动态链接库DLL 导出类及其中的函数
![编译VC++类的动态链接库DLL 导出类及其中的函数](https://img.taocdn.com/s3/m/ceb3b4e2aeaad1f346933f69.png)
如果已经写好了一个C++的类,希望把它做成dll动态链接库,这里介绍一种简单的方法。
1、制作dll利用VC6新建工程时选择win32 dynamic-Link Library,然后添加头文件和cpp文件。
假设类名为exp,添加头文件exp.h,头文件中声明类的定义,添加exp.cpp,其中是成员函数的具体定义。
与一般写类的定义不同,在exp.h 中需要写成class __declspec(dllexport) exp{...}从而说明以后从dll要被导出的类是哪一个。
这样编译完就会产生exp.dll和exp.lib两个文件。
2、dll的调用当已经生成dll后,可以在其它程序中调用dll中的类和成员函数。
方法如下:a)把exp.dll和exp.lib复制到调用程序的执行路径下,注意不是debug 路径下。
b)在project->setting->link里添加exp.libc)把exp.h复制到调用程序的执行路径下,将__declspec(dllexport)改成__declspec(dllimport)这样在主程序中就可以使用exp.h中声明的类和它的成员函数了。
如何在VC中导出类,这是一个常有人问起的问题,下面我以一个简单的例子来说明这个问题:首先使用Wizard创建一个Win32 Dynamic-Link Library工程,然后定义一个简单的C++类CInDLL。
由于该类会被工程之外的文件所引用,所以需要对这个类进行引出。
因为只有引出后所生成的 DLL中才带有供足够的信息以在连接和运行时被正确引入到进程空间中。
有两种方法可以引出类,使用__declspec(dllexport)定义和使用定义文件。
下面先讲使用__declspec(dllexport)的方法:将类定义改为:class__declspec(dllexport) CInDLL 就可以了。
(译者:你也许不相信会有这么简单,我也不相信。
C语言的DLL编写与调用
![C语言的DLL编写与调用](https://img.taocdn.com/s3/m/46bb5846ec3a87c24128c47f.png)
C语言的DLL编写
1、打开C语言的Microsoft Visual C++ 6.0
2、选择file--> new ,在project选项中选择MFC AppWizard(dll),给工程起名字,
选择保存路径。
3、选择Regular DLLusingshared MFCDLL,点击finish
4、此时工程的结构图如下所示
5、在FourthSample源文件中写上对外暴露的dll函数方法
6、在FourthSample.def中追加对外暴露的方法名
7、选中FourthSample.cpp,编译源文件
8、生成dll文件
9、注意事项:在编译源文件时可能要报以下错误,
解决方法:
选中该源文件,点击右键Settings,
再次编译,通过。
C语言调用DLL
1、新建一个c的源文件,进行dll调用的测试
2、源代码如下,代码中有关键词用法,请参考其他资料
3、弹出一个对话框,说明dll调用成功。
注意事项:注意将test.dll动态链接库放在该程序目录下(FourthSample.dll重名为test.d ll)。
cDLL编程详解
![cDLL编程详解](https://img.taocdn.com/s3/m/1908be30ec630b1c59eef8c75fbfc77da3699750.png)
cDLL编程详解DLL(Dynamic Link Library)的概念,你可以简单的把DLL看成一种仓库,它提供给你一些可以直接拿来用的变量、函数或类。
在仓库的发展史上经历了“无库-静态链接库-动态链接库”的时代。
静态链接库与动态链接库都是共享代码的方式,如果采用静态链接库,则无论你愿不愿意,lib中的指令都被直接包含在最终生成的EXE文件中了。
但是若使用DLL,该DLL不必被包含在最终EXE文件中,EXE文件执行时可以“动态”地引用和卸载这个与EXE独立的DLL文件。
静态链接库和动态链接库的另外一个区别在于静态链接库中不能再包含其他的动态链接库或者静态库,而在动态链接库中还可以再包含其他的动态或静态链接库。
DLL:(1)DLL 的编制与具体的编程语言及编译器无关只要遵循约定的DLL接口规范和调用方式,用各种语言编写的DLL都可以相互调用。
譬如Windows提供的系统DLL(其中包括了Windows的API),在任何开发环境中都能被调用,不在乎其是Visual Basic、Visual C++还是Delphi。
(2)动态链接库随处可见我们在Windows目录下的system32文件夹中会看到kernel32.dll、user32.dll和gdi32.dll,windows的大多数API都包含在这些DLL中。
kernel32.dll中的函数主要处理内存管理和进程调度;user32.dll中的函数主要控制用户界面;gdi32.dll中的函数则负责图形方面的操作。
一般的程序员都用过类似MessageBox的函数,其实它就包含在user32.dll这个动态链接库中。
由此可见DLL对我们来说其实并不陌生。
(3)VC动态链接库的分类Visual C++支持三种DLL,它们分别是Non-MFC DLL(非MFC 动态库)、MFC Regular DLL(MFC规则DLL)、MFC ExtensionDLL(MFC扩展DLL)。
C#项目中解析C++编写的.dll文件
![C#项目中解析C++编写的.dll文件](https://img.taocdn.com/s3/m/a1e9b3007dd184254b35eefdc8d376eeafaa175c.png)
C#项⽬中解析C++编写的.dll⽂件例如:现"D:\TestInterface\"下有⼀个C++编写的TestInterface.dll⽂件,使⽤Depends⼯具查看到它含两个接⼝函数Sum(int addend1,int addend2)和Subtraction(int minuend,int subtrahend),需要在C#项⽬中进⾏解析调⽤。
⽤例:[DllImport("kernel32.dll", EntryPoint = "LoadLibrary")]public static extern int LoadLibrary([MarshalAs(UnmanagedType.LPStr)] string lpLibFileName);[DllImport("kernel32.dll", EntryPoint = "GetProcAddress")]public static extern IntPtr GetProcAddress(int hModule, [MarshalAs(UnmanagedType.LPStr)] string lpProcName);//先声明两个与接⼝函数相关的委托delegate bool delegateSum(int addend1,int addend2);delegate bool delegateSubtraction(int minuend,int subtrahend);//定义C#项⽬中的Sum⽅法private int Sum(int addend1,int addend2){//1.从指定路径加载.dll⽂件int hModule = LoadLibrary(@"D:\TestInterface\TestInterface.dll");if (hModule == 0){return false;}//2. 读取函数指针IntPtr intFnPtr1 = GetProcAddress(hModule, "Sum");//3. 将函数指针封装成委托delegateSum _delegateSum= (delegateSum)Marshal.GetDelegateForFunctionPointer(intFnPtr1, typeof(delegateSum));//4、返回实际操作return _delegateSum(int addend1,int addend2);}//定义C#项⽬中的Subtraction⽅法private int Subtraction(int minuend,int subtrahend){//1.从指定路径加载.dll⽂件int hModule = LoadLibrary(@"D:\TestInterface\TestInterface.dll");if (hModule == 0){return false;}//2. 读取函数指针IntPtr intFnPtr1 = GetProcAddress(hModule, "Subtraction");//3. 将函数指针封装成委托delegateSubtraction _delegateSubtraction= (delegateSubtraction)Marshal.GetDelegateForFunctionPointer(intFnPtr1,typeof(delegateSubtraction));//4、返回实际操作return _delegateSubtraction(int minuend,int subtrahend);}。
单个CS文件编译成DLL文件
![单个CS文件编译成DLL文件](https://img.taocdn.com/s3/m/c2bec208e3bd960590c69ec3d5bbfd0a7956d529.png)
单个CS文件编译成DLL文件DOS命令下输入:C:\WINDOWS\\Framework\v2.0.50727\csc.ex e /out:TEST.dll /t:library TEST.csC:\WINDOWS\\Framework\v2.0.50727\csc.ex e /t:library TEST.cs=================相关技术文档如何用CSC.exe来编译Visual C#的代码文件Visual C#的编译器和以往编程语言的编译器有着明显的不同。
其最大的不同点就是,以往的程序编译器是把编写好的程序代码编译生成可以直接为计算机所使用的机器语言。
虽然Visual C#的编译器也可以把编写好的程序代码编译成EXE或者是DLL文件,但这种文件只是一种IL文件(中间语言),此IL文件不能直接被计算机使用。
只是当此IL文件被调用的时候,再通过一种名叫JIT(即时编译)编译器把此IL 文件生成可以供计算机使用的机器代码。
可见Visual C#的编译过程大致可以分成二个部分,第一个部分,从程序代码到IL文件,这个过程是通过人工干预来实现的,即通过CSC.exe来实现的;第二个部分,从IL文件到机器语言,这个工程是机器自动实现的。
本文就将具体来说明一下第一个部分,即如何用CSC.exe来正确编译Visual C#文件。
CSC.exe把Visual C#程序代码编译成IL文件时,有着很多参数和开关选项。
正确的了解和运用这些参数和开关有时会解决一些看似很棘手的问题。
下面就通过一张表来大致说明一下这些参数和开关的具体作用。
这些参数和开关选项是按照字母顺序来排列的。
其中带"*",是一些常用的参数或开关。
选项用途@ * 指定响应文件。
/?, /help 在控制台的计算机屏幕上显示编译器的选项/addmodule 指定一个或多个模块为集会的一部分/baseaddress 指定装入DLL的基础地址/bugreport 创建一个文件,该文件包含是报告错误更加容易的信息/checked 如果整数计算溢出数据类型的边界,则在运行时产生一个例外的事件/codepage 指定代码页以便在编译中使用的所有源代码文件/debug * 发送调试信息/define 定义预处理的程序符号/doc * 把处理的文档注释为XML文件/fullpaths 指定编译输出文件的反正路径/incremental 对源代码的文件进行增量编译/linkresource 把.NET资源链接到集合中/main 指定Main方法的位置/nologo 禁止使用编译器的标志信息/nooutput 编译文件但不输出文件/nostdlib 不导出标准库(即mscorlib.dll)/nowarn 编译但编译器并不显示警告功能/optimize 打开或者关闭优化/out * 指定输出文件/recurse 搜索编译源文件的子目录/reference * 从包含集合的文件中导入元数据/target * 指定输出文件的格式/unsafe 编译使用非安全关键字的代码/warn 设置警告级别/warnaserror 提升警告为错误/win32icon 插入一个.ico文件导输出文件中去/win32res 插入一个Win32资源导输出文件中====================================== =========具体说明:一.@这个选项是用来指定响应文件。
C#生成DLL文件的方法小结
![C#生成DLL文件的方法小结](https://img.taocdn.com/s3/m/071fed39905f804d2b160b4e767f5acfa1c783be.png)
C#⽣成DLL⽂件的⽅法⼩结使⽤csc命令将.cs⽂件编译成.dll的过程很多时候,我们需要将.cs⽂件单独编译成.dll⽂件, 操作如下:打开命令窗⼝->输⼊cmd到控制台->cd C:\WINDOWS\\Framework\v1.1.4322转到安装的该⽬录下->执⾏csc命令csc /target:library File.cs->在该⽬录下产⽣⼀个对应名字的.dll⽂件(前提:把.cs⽂件放到C:\WINDOWS\\Framework\v1.1.4322⽬录下)csc命令的⽅式很多,请参考以下译 File.cs 以产⽣ File.execsc File.cs 编译 File.cs 以产⽣ File.dllcsc /target:library File.cs 编译 File.cs 并创建 My.execsc /out:My.exe File.cs 通过使⽤优化和定义 DEBUG 符号,编译当前⽬录中所有的 C# ⽂件。
输出为 File2.execsc /define:DEBUG /optimize /out:File2.exe *.cs 编译当前⽬录中所有的 C# ⽂件,以产⽣ File2.dll 的调试版本。
不显⽰任何徽标和警告csc /target:library /out:File2.dll /warn:0 /nologo /debug *.cs 将当前⽬录中所有的 C# ⽂件编译为 Something.xyz(⼀个 DLL)csc /target:library /out:Something.xyz *.cs 编译 File.cs 以产⽣ File.dllcsc /target:library File.cs这个就是我们使⽤最多的⼀个命令,其实可以简单的写成csc /t:library File.cs,另外的⼀个写法是 csc /out:mycodebehind.dll /t:library mycodebehind.cs,这个可以⾃⼰指定输出的⽂件名。
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。
“分析家C语言接口编译dll文件”[第一讲]准备的东东1.安装VC++ 6.0软件2.下载分析家C语言接口文件。
3.具备C++编程的知识。
如果不会,自己下载教学软件,或找本相关的书籍。
4.会分析家基本公式编写。
如果不会,在本站下载相关分析家公式编写资料。
准备好后,我开始讲一个完整公式的编写过程。
[第二讲]练习编译dll文件。
1.解包分析家c语言接口2.启动Vc++点击菜单[File]选Open Workspace。
选择文件FxjFunc.dsw3.选择菜单[Build],选择Build FxjFunc.dll生成FxjFunc.dll文件。
如果没有错误,显示下面结果。
--------------------Configuration: FxjFunc - Win32 Debug-------------------- FxjFunc.dll - 0 error(s), 0 warning(s)4.生成的FxjFunc.dll文件在D:\SUPERSTK目录中。
如果不在当前使用的分析家目录,可以将FxjFunc.dll文件复制到分析家目录中,也可以复制到飞狐\FoxTrader\FmlDLL目录中。
5.在飞狐或分析家建立公式,看看结果。
公式只有下面一句,10日close均线。
ma1:"fxjfunc@mymaclose"(10); 如果结果正确,你已经成功编写了dll公式了。
在后面的讲课中介绍编写技巧。
第三讲]分析家扩展函数规范及设计分析家扩展函数规范如下:///////////////////////////////////////////////////////////////////////////#ifndef __FXJFUNC_H_INCLUDE#define __FXJFUNC_H_INCLUDE/*///////////////////////////////////////////////////////////////////////////分析家扩展函数规范V3.101.本规范适用于分析家3.10标准版和专业版公式系统.2.扩展函数用于实现系统函数不能实现的特殊算法.3.扩展函数用windows 32位动态连接库实现,建议使用Microsoft Visual C++编程.4.调用时在公式编辑器中写"动态库名称@函数名称"(参数表)即可,例如下面函数可以写为"FXJFUNC@MYCMALOSE"(5)5.动态连接库名称和函数名称可以自己定义.6.使用时可以将动态库拷贝到分析家目录下使用.*/#ifdef __cplusplusextern "C"{#endif //__cplusplus/////////////////////////////////////////////////////////////////////////// //分析周期enum DATA_TYPE{TICK_DATA=2, //分笔成交MIN1_DATA, //1分钟线MIN5_DATA, //5分钟线MIN15_DATA, //15分钟线MIN30_DATA, //30分钟线MIN60_DATA, //60分钟线DAY_DATA, //日线WEEK_DATA, //周线MONTH_DATA, //月线MULTI_DATA //多日线};/////////////////////////////////////////////////////////////////////////// //基本数据typedef struct tagSTKDATA{tim e_t m_time; //时间,UCTfloat m_fOpen; //开盘float m_fHigh; //最高float m_fLow; //最低float m_fClose; //收盘float m_fVolume; //成交量float m_fAmount; //成交额WORD m_wAdvance; //上涨家数(仅大盘有效)WORD m_wDecline; //下跌家数(仅大盘有效)} STKDATA;//////////////////////////////////////////////////////////////////////////// //扩展数据,用于描述分笔成交数据的买卖盘typedef union tagSTKDATAEx{struct{float m_fBuyPrice[3]; //买1--买3价float m_fBuyVol[3]; //买1--买3量float m_fSellPrice[3]; //卖1--卖3价float m_fSellVol[3]; //卖1--卖3量};float m_fDataEx[12]; //保留} STKDATAEx;///////////////////////////////////////////////////////////////////////////// /*财务数据顺序(m_pfFinData内容)序号内容0 总股本(万股),1 国家股,2 发起人法人股,3 法人股,4 B股,5 H股,6 流通A股,7 职工股,8 A2转配股,9 总资产(千元),10 流动资产,11 固定资产,12 无形资产,13 长期投资,14 流动负债,15 长期负债,16 资本公积金,17 每股公积金,18 股东权益,19 主营收入,20 主营利润,21 其他利润,22 营业利润,23 投资收益,24 补贴收入,25 营业外收支,26 上年损益调整,27 利润总额,28 税后利润,29 净利润,30 未分配利润,31 每股未分配,32 每股收益,33 每股净资产,34 调整每股净资,35 股东权益比,36 净资收益率*////////////////////////////////////////////////////////////////////////////////函数数据结构typedef struct tagCALCINFO{const DWORD m_dwSize; //结构大小const DWORD m_dwVersion; //调用软件版本(V2.10 : 0x210)const DWORD m_dwSerial; //调用软件序列号const char* m_strStkLabel; //股票代码const BOOL m_bIndex; //大盘const int m_nNumData; //数据数量(pData,pDataEx,pResultBuf数据数量)const STKDATA* m_pData; //常规数据,注意:当m_nNumData==0时可能为NULL const STKDATAEx* m_pDataEx; //扩展数据,分笔成交买卖盘,注意:可能为NULLconst int m_nParam1Start; //参数1有效位置const float* m_pfParam1; //调用参数1const float* m_pfParam2; //调用参数2const float* m_pfParam3; //调用参数3const float* m_pfParam4; //调用参数3float* m_pResultBuf; //结果缓冲区const DATA_TYPE m_dataType; //数据类型const float* m_pfFinData; //财务数据} CALCINFO;/*注:1.函数调用参数由m_pfParam1--m_pfParam4带入,若为NULL则表示该参数无效.2.当一个参数无效时,则其后的所有参数均无效.如:m_pfParam2为NULL,则m_pfParam3,m_pfParam4一定为NULL.3.参数1可以是常数参数或序列数参数,其余参数只能为常数参数.4.若m_nParam1Start<0, 则参数1为常数参数,参数等于*m_pfParam1;5.若m_nParam1Start>=0,则参数1为序列数参数,m_pfParam1指向一个浮点型数组, 数组大小为m_nNumData,数据有效范围为m_nParam1Start--m_nNumData.在时间上m_pData[x] 与m_pfParam1[x]是一致的*/////////////////////////////////////////////////////////////////////////////////////* 函数输出__declspec(dllexport) int xxxxxxxx(CALCINFO* pData); ---------- A__declspec(dllexport) int xxxxxxxxVAR(CALCINDO* pData); ---------- B1.函数名称需全部大写.2.函数必须以上述A,B两种形式之一声明,请用实际函数名称替代xxxxxxxx;对于C++程序还需包括在extern "C" { } 括号中.3.上述形式A用于声明不带参数或全部参数为常数的函数;形式B用于声明参数1为序列数的函数;两种函数的区别在于后者以VAR结尾.4.函数计算结果用pData->m_pResultBuf带回.5.函数返回-1表示错误或全部数据无效,否则返回第一个有效值位置,即:m_pResultBuf[返回值] -- m_pResult Buf[m_nNumData-1]间为有效值.6.函数名称长度不能超过15字节,动态连接库文件名不能超过9字节(不包括扩展名),动态库名称不能叫SYSTEM,EXPLORER7.编译时请请选择1字节对齐*///示例函数,使用时用实际名称替换__declspec(dllexport) int WINAPI MYMACLOSE(CALCINFO* pData);__declspec(dllexport) int WINAPI MYMAVAR(CALCINFO* pData);__declspec(dllexport) int WINAPI MYMACLOSE_CALC_PREV(CALCINFO* pData);__declspec(dllexport) int WINAPI MYMAVAR_CALC_PREV(CALCINFO* pData);#ifdef __cplusplus}#endif //__cplusplus#endif //__FXJFUNC_H_INCLUDE////////////////////////////////////////////////////////////////////////分析家的数据结构见上面。