树莓派进阶之路 (013) – 树莓派2/3 C语言使用PWM

由于树莓派只有1,12两个口有pwm,于是使用

softPwmCreate(LED, 0, 100);  //创建软PWM
softPwmWrite(LED, i);

这两个完成了工作

 

文章原来的路径:https://www.cnblogs.com/jikexianfeng/p/6938119.html
====================================
我手里面的是树莓派3,系统是Raspbian官方操作系统,已经安装好了wiringPi。        PWM简介:脉宽调制(PWM)是指用微处理器的数字输出来对模拟电路进行控制,是一种对模拟信号电平进行数字编码的方法。wiringpi有两种方式产生PWM,第一种为树莓派硬件PWM,如果需要精确的PWM控制的话,最好使用硬件PWM。第二种为wiringpi软件模拟的pwm,我们一种一种的介绍。
首先是电路连接,准备做一个LED呼吸灯程序。所以电路很简单,一个LED,一个100Ω的电阻。电阻串联在LED正极,然后连接到树莓派12号引脚。LED负极接地。
一、硬件PWM。
硬件PWM IO口为物理的12号端口(当然,这个也作为软件PWM使用)。如下图所示:

1、使用C语言编写硬件PWM程序
pi@Raspi:~ $ sudo nano hardware_pwd.c

2、写入以下程序

复制代码
 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 #include <stdint.h>
 4 #include <wiringPi.h>
 5 
 6 #define LED 1
 7 
 8 int main(void)
 9 {
10     int bright;
11     printf("Raspberry Pi wiringPi PWM test program\n");
12     if (wiringPiSetup() == -1)
13     {
14         printf("GPIO setup error!\n");
15         exit(1);
16     }
17     pinMode(LED,PWM_OUTPUT);
18     while(1)
19     {
20     for (bright = 0; bright < 1024; ++bright)
21         {
22             pwmWrite(LED,bright);
23             delay(12);
24         }
25     for (bright = 1023; bright >= 0; --bright)
26         {
27             pwmWrite(LED,bright);
28             delay(12);
29         }
30     }
31     return 0;
32 }
复制代码

3、编译

pi@Raspi:~ $ gcc -o hardware_pwd hardware_pwd.c -lwiringPi

4、运行

pi@Raspi:~ $ sudo ./hardware_pwd

现在应该可以看到你的LED有呼吸灯效果了。

复制代码
 1 /*
 2  ============================================================================
 3  Name        : software_pwm.c
 4  Author      : Cheetah
 5  Version     :
 6  Copyright   : Geeiot
 7  Description : PWM in C, Ansi-style
 8  ============================================================================
 9  */
10 
11 #include <stdio.h>
12 #include <stdlib.h>
13 #include <stdint.h>
14 #include <wiringPi.h>
15 #include <softPwm.h>
16 
17 #define LED 1   //同样使用1号IO口
18 
19 int main(void) 
20 {
21     int i = 0;
22     if (wiringPiSetup() == -1)  //初始化wiringpi
23     {
24         printf("Setup GPIO error!\n");
25         return -1;
26     }
27     softPwmCreate(LED, 0, 100);  //创建软PWM
28     while (1) 
29     {
30         for (i = 0; i < 100; i++) 
31         {
32             softPwmWrite(LED, i);
33             delay(10);
34         }
35         for (i = 99; i > 0; i--) 
36         {
37             softPwmWrite(LED, i);
38             delay(10);
39         }
40     }
41     return 0;
42 }
复制代码

二、软件模拟PWM
wiringPi 中包含了一个软件驱劢的 PWM 处理库,可以在任意的树莓派 GPIO 上输出PWM 信号。但是软件模拟的PWM有一些限制。因为PWM的频率越高,所需要的CPU资源越多,所以在这之间有一些平衡。
步骤同上,我这里就直接贴出代码了。特别注意编译的时候会多一个-lpthread选项。

编译

pi@Raspi:~ $ gcc -o software_pwm software_pwm.c -lwiringPi -lpthread

运行之后会有同样的效果!

特别注意:必须使用 wiringPiSetup()、 wiringPiSetupGpio()或者 wiringPiSetupPhys()函数来初始化 wiringPi。wiringPiSetupSys()是丌够快的,因此,必须使用 sudo 命令来运行程序。
附上wiringpi用户手册的下载:https://www.geeiot.net/forum.php … 1121&extra=page%3D1

ubuntu 更新加入ESP8266开发环境

最近在弄这个WiFi模块,发现网上SDK开发方面的资料很少,发现了一套视频教程,不过主讲人的讲课方式实在受不了。对基于SDK开发感兴趣的同学可以通过本帖在Ubuntu系统上通过Eclipes搭建开发环境。

过程可以分为两步:
1、下载、编译SDK
2、配置Eclipes

一、下载、编译SDK

esp8266的sdk有两种,分别是ESP8266_RTOS_SDK和ESP8266_NONOS_SDK,这两者的区别在于RTOS_SDK有一个叫做RTOS的操作系统,采用了NONOS_SDK部分接口,不支持AT指令。
详见:Q: What is the difference between RTOS and the non-OS SDK?

这里我们使用NONOS_SDK,下载地址:esp-open-sdk

里边集成了NONOS_SDK的编译器和烧录工具等,也可用此编译器编译ESP_RTOS_SDK中的项目。

我们直接在命令行进行操作:

1
2
3
4
5
6
7
8
9
10
11
12
#安装一些依赖工具
$ sudo apt-get install make unrar-free autoconf automake libtool gcc g++ gperf \
    flex bison texinfo gawk ncurses-dev libexpat-dev python-dev python python-serial \
    sed git unzip bash help2man wget bzip2
#如果ubuntu版本高于14.04可能还需要此工具
$ sudo apt-get install libtool-bin
#使用git克隆项目到本地,这里假设项目克隆到了/home/mmmmar/esp-open-sdk
$ git clone --recursive https://github.com/pfalcon/esp-open-sdk.git
#进入项目文件夹
$ cd /home/mmmmar/esp-open-sdk
#编译
$ make STANDALONE=y

注意:在SDK的编译过程中需要联网下载一些依赖库并编译,而且下载过程很容易失败,我在下载时挂代理才成功的。
如果编译失败可以查看esp-open-sdk/crosstool-NG/build.log 查看崩溃信息,一般都是下载失败。

编译成功后会在esp-open-sdk文件夹出现xtensa-lx106-elf  esptool  ESP8266_NONOS_SDK三个文件夹,分别是编译器,烧录工具,NONOS_SDK最新版。
这时需要把编译器路径加入到系统路径中,执行:

1
2
#此命令只作用于当前控制台
export PATH=/home/mmmmar/esp-open-sdk/xtensa-lx106-elf/bin:$PATH

这时就可以编译esp-open-sdk/ESP8266_NONOS_SDK/examples中的示例工程了。
需要注意,要把ESP8266_NONOS_SDK文件夹复制到esp-open-sdk文件夹的外部,假如我们要编译examples文件夹中的at项目,我们需要把at文件夹复制到ESP8266_NONOS_SDK目录下,不然编译会失败。
复制完之后路径如下:

1
2
3
4
5
/home/mmmmar
├── ESP8266_NONOS_SDK
│   ├── at
│   ├── examples
└── esp-open-sdk

复制完之后就可以编译at(我们最初用的AT指令就是这个项目,不过我们只能添加新的AT命令)项目了。
执行at文件夹下的gen_misc.sh,这里需要输入一些参数。
对于那些参数我也不是特别清楚,我的esp-01(黑色)选择的是:
boot version      = none
spi size and map =   1024KB( 512KB+ 512KB)

其余默认。黑色的版的esp-01有1MB的存储空间,而蓝色版只有512KB,不能使用最新版的AT固件。

数据抓取工作 ODDS.500.COM 程序演示

首先,程序列表中有下列文件
1. 爬虫odds.500.com.exe
2.setting.txt
3.所有公司.txt
4. mfc100.dll

第一步打开《setting.txt》, 第一行是要查询的网址(需要是修改),第二行是固定的跳板(不能修改)第三行是下载的数据存放的文件(可以修改)
后面的是各个公司的名称,这些数据可以从《所有公司.txt》中获取

2016062805
2016062806

第二步,打开程序,在右下角的图标或者右上角的透明图标上可以右键,测水一次。完成会有提示。

2016062803

2016062804

最后自动在生成d:\my.csv数据。

2016062807

。完。

绝对的BS, 李易峰肇事被扣24分罚款2000

BS的重点是,跑了,就什么都查不到了,有没有酒驾自己说了算,以后会有更多人撞了,或者酒驾撞了就跑,因为酒驾/醉驾撞了,被查到,要进去的,高晓松就是这样。就应该从严处理,特别是所谓的名人。

虽然我有面盲症,记不住,这猪的样子,但是会记得这样的名子,

如果我是导演,绝不用这样的人,作为一个观众,他拍的电影,也要三思,如果还要给钱进场的更三思。
新闻连接:http://news.qq.com/a/20160616/002625.htm

 

 

改写策略为王TSKING (源代码) 增加 SQL存储三 创建数据库表

//编写了几个连接数据库的函数,由于是公共函数,可以独立编写在新的文件中,例如我自己建了一个StkFunction.h ,StkFunction.cpp上

Dbcnn

 

 

在CStkLibWnd 中增加了数据库相关的变量及初始化的函数,
BOOL m_IsSqlDBConnect; //是否已经连接Sql Db

_ConnectionPtr m_pCnn; //连接数据库

CSPString m_szConnString;//连接字符串

DBInitTable() ; //数据库初始化
CnnExecuteSql(CSPString sSql, bool nErr); //执行Sql命令

////////用于执行Sql命令

int CStkLibWnd::CnnExecuteSql(CSPString sSql, bool nErr)
{
_variant_t vntRecs[100];
long lRecs=1;
if(nErr)
{
try
{
m_pCnn->Execute(_bstr_t(sSql),
vntRecs,
adCmdText);
}
catch(_com_error e)
{
lRecs=0;
}
}
else
{
m_pCnn->Execute(_bstr_t(sSql),
vntRecs,
adCmdText);
}
return lRecs;
}

// DBInitTable() 只需要运行一次即可,把test()的改一下并运行一次就好。

 

int CStkLibWnd::DBInitTable()
{

CSPString sSql = “”;
int nflase =0;

//1. 证券代码表

sSql= “CREATE TABLE STK_STOCK( \n”
“m_wMarket [varchar](8), \n”
“m_szLabel Varchar(10), \n”
“m_szName Varchar(32), \n”
“m_szPingYing [varchar](10), \n”
“m_nUnit numeric(4), \n”
“m_nDigit numeric(4), \n”
“m_fLastClose [numeric](18,6), \n”
“[m_time] [datetime] ) \n”;
nflase += CnnExecuteSql(sSql, true);
//2. 实行行情
sSql= “CREATE TABLE STK_REPORT( \n”
“[m_cbSize] [varchar](4), \n”
“[m_wMarket] [varchar](8), \n”
“[m_szLabel] [varchar](10) ,\n”
“[m_szName] [varchar](30), \n”
“[m_time] [datetime] , \n”
“[m_dwFlag] [varchar](4), \n”
“[m_fLast] [numeric](18,6), \n”
“[m_fOpen] [numeric](18,6), \n”
“[m_fHigh] [numeric](18,6), \n”
“[m_fLow] [numeric](18,6), \n”
“[m_fNew] [numeric](18,6), \n”
“[m_fVolume] [numeric](18,6), \n”
“[m_fAmount] [numeric](18,6), \n”
“[m_fBuyPrice1] [numeric](18,6), \n”
“[m_fBuyVolume1] [numeric](18,6), \n”
“[m_fSellPrice1] [numeric](18,6), \n”
“[m_fSellVolume1] [numeric](18,6), \n”
“[m_fBuyPrice2] [numeric](18,6), \n”
“[m_fBuyVolume2] [numeric](18,6), \n”
“[m_fSellPrice2] [numeric](18,6), \n”
“[m_fSellVolume2] [numeric](18,6), \n”
“[m_fBuyPrice3] [numeric](18,6), \n”
“[m_fBuyVolume3] [numeric](18,6), \n”
“[m_fSellPrice3] [numeric](18,6), \n”
“[m_fSellVolume3] [numeric](18,6), \n”
“[m_fBuyPrice4] [numeric](18,6), \n”
“[m_fBuyVolume4] [numeric](18,6), \n”
“[m_fSellPrice4] [numeric](18,6), \n”
“[m_fSellVolume4] [numeric](18,6), \n”
“[m_fBuyPrice5] [numeric](18,6), \n”
“[m_fBuyVolume5] [numeric](18,6), \n”
“[m_fSellPrice5] [numeric](18,6), \n”
“[m_fSellVolume5] [numeric](18,6), \n”
“[m_fAvgPrice] [numeric](18,6), \n”
“[m_dwTickAll] [varchar](4)) \n”;

nflase += CnnExecuteSql(sSql, true);

//3. 分笔数据(盘口) 主表

sSql= “CREATE TABLE STK_TICK_HDR ( \n”
“[m_wMarket] [varchar](8), \n”
“[m_szLabel] [varchar](10), \n”
“[m_lDate] DateTime, \n”
“[m_fLastClose] [numeric](18,6), \n”
“[m_fOpen] [numeric](18,6), \n”
“[m_nAllCount] [numeric](18,6), \n”
“[m_nCount] [numeric](18,6)) \n”;

nflase += CnnExecuteSql(sSql, true);

//4. 分笔数据(盘口) 从表

sSql= “CREATE TABLE STK_TICK( \n”
“[m_wMarket] [varchar](8), \n”
“[m_szLabel] [varchar](10) ,\n”
“[m_szName] [varchar](30), \n”
“[m_time] DateTime, \n”
“[m_lTime] DateTime, \n”
“[m_fHigh] [numeric](18,6), \n”
“[m_fLow] [numeric](18,6), \n”
“[m_fNewPrice] [numeric](18,6), \n”
“[m_fVolume] [numeric](18,6), \n”
“[m_fAmount] [numeric](18,6), \n”
“[m_lStroke] [numeric](18,6), \n”
“[m_fBuyPrice1] [numeric](18,6), \n”
“[m_fBuyVolume1] [numeric](18,6), \n”
“[m_fSellPrice1] [numeric](18,6), \n”
“[m_fSellVolume1] [numeric](18,6), \n”
“[m_fBuyPrice2] [numeric](18,6), \n”
“[m_fBuyVolume2] [numeric](18,6), \n”
“[m_fSellPrice2] [numeric](18,6), \n”
“[m_fSellVolume2] [numeric](18,6), \n”
“[m_fBuyPrice3] [numeric](18,6), \n”
“[m_fBuyVolume3] [numeric](18,6), \n”
“[m_fSellPrice3] [numeric](18,6), \n”
“[m_fSellVolume3] [numeric](18,6), \n”
“[m_fBuyPrice4] [numeric](18,6), \n”
“[m_fBuyVolume4] [numeric](18,6), \n”
“[m_fSellPrice4] [numeric](18,6), \n”
“[m_fSellVolume4] [numeric](18,6), \n”
“[m_fBuyPrice5] [numeric](18,6), \n”
“[m_fBuyVolume5] [numeric](18,6), \n”
“[m_fSellPrice5] [numeric](18,6), \n”
“[m_fSellVolume5] [numeric](18,6))\n”;
nflase += CnnExecuteSql(sSql, true);

//5. 补充除权数据

sSql= “CREATE TABLE STK_POWER ( \n”
“[m_dwHeadTag] [varchar](4), \n”
“[m_wMarket] [varchar](8), \n”
“[m_szLabel] [varchar](10), \n”
“[m_time] DateTime, \n”
“[m_fGive] [numeric](18,6), \n”
“[m_fPei] [numeric](18,6), \n”
“[m_fPeiPrice] [numeric](18,6), \n”
“[m_fProfit] [numeric](18,6), \n”
“[m_dwReserved] [varchar](4)) \n”;
nflase += CnnExecuteSql(sSql, true);

//6. 分时数据

sSql= “CREATE TABLE STK_KDATA_MIN (\n”
“[m_dwHeadTag] [varchar](4), \n”
“[m_wMarket] [varchar](8), \n”
“[m_szLabel] [varchar](10), \n”
“[m_date] DateTime, \n”
“[m_time] DateTime, \n”
“[m_fOpen] [numeric](18,6), \n”
“[m_fHigh] [numeric](18,6), \n”
“[m_fLow] [numeric](18,6), \n”
“[m_fClose] [numeric](18,6), \n”
“[m_fVolume] [numeric](18,6), \n”
“[m_fAmount] [numeric](18,6), \n”
“[m_dwAdvance] [varchar](4), \n”
“[m_dwDecline] [varchar](4), \n”
“[m_dwReserved] [varchar](4)) \n”;
nflase += CnnExecuteSql(sSql, true);
//7. 日线数据表

sSql= “CREATE TABLE STK_KDATA_DAY( \n”
“[m_dwHeadTag] [varchar](4), \n”
“[m_wMarket] [varchar](8), \n”
“[m_szLabel] [varchar](10), \n”
“[m_time] DateTime, \n”
“[m_fOpen] [numeric](18,6), \n”
“[m_fHigh] [numeric](18,6), \n”
“[m_fLow] [numeric](18,6), \n”
“[m_fClose] [numeric](18,6), \n”
“[m_fVolume] [numeric](18,6), \n”
“[m_fAmount] [numeric](18,6), \n”
“[m_wAdvance] [varchar](4), \n”
“[m_wDecline] [varchar](4)) \n”;
nflase += CnnExecuteSql(sSql, true);
//8. 1分钟数据线

sSql= “CREATE TABLE STK_KDATA_MIN1 (\n”
“[m_dwHeadTag] [varchar](4), \n”
“[m_wMarket] [varchar](8), \n”
“[m_szLabel] [varchar](10), \n”
“[m_date] DateTime, \n”
“[m_time] DateTime, \n”
“[m_fOpen] [numeric](18,6), \n”
“[m_fHigh] [numeric](18,6), \n”
“[m_fLow] [numeric](18,6), \n”
“[m_fClose] [numeric](18,6), \n”
“[m_fVolume] [numeric](18,6), \n”
“[m_fAmount] [numeric](18,6), \n”
“[m_dwAdvance] [varchar](4), \n”
“[m_dwDecline] [varchar](4), \n”
“[m_dwReserved] [varchar](4)) \n”;
nflase += CnnExecuteSql(sSql, true);

//9. 5分钟数据线
sSql= “CREATE TABLE STK_KDATA_MIN5 ( \n”
“[m_dwHeadTag] [varchar](4), \n”
“[m_wMarket] [varchar](8), \n”
“[m_szLabel] [varchar](10), \n”
“[m_date] DateTime, \n”
“[m_time] DateTime, \n”
“[m_fOpen] [numeric](18,6), \n”
“[m_fHigh] [numeric](18,6), \n”
“[m_fLow] [numeric](18,6), \n”
“[m_fClose] [numeric](18,6), \n”
“[m_fVolume] [numeric](18,6), \n”
“[m_fAmount] [numeric](18,6), \n”
“[m_dwAdvance] [varchar](4), \n”
“[m_dwDecline] [varchar](4), \n”
“[m_dwReserved] [varchar](4)) \n”;
nflase += CnnExecuteSql(sSql, true);

//10. 操作记录表

sSql= “CREATE TABLE STK_LOG ( \n”
” m_date DateTime, \n”
” m_Updated [varchar](10), \n”
” m_nCount [numeric](8), \n”
” m_wMarket [varchar](10), \n”
” m_szLabel [varchar](10), \n”
” m_Type [varchar](30)) \n”;
nflase += CnnExecuteSql(sSql, true);

 

//11. 基本信息表
sSql= “create table basedata( \n”
“m_dwMarket varchar(8),\n” // DWORD ; 证券市场类型,see CStock::StockMarket
“m_szCode varchar(8),\n” // char m_szCode[STKLIB_MAX_CODE2]; // 证券代码,以’\0’结尾
“m_szDomain varchar(20),\n” // char m_szDomain[STKLIB_MAX_DOMAIN]; // 板块
“m_szProvince varchar(20),\n” // char m_szProvince[STKLIB_MAX_PROVINCE]; // 省份
“m_time datetime,\n” // time_t m_time; // 日期,time_t
“m_date datetime,\n” // DWORD m_date; // 日期 Format is YYYYMMDD for base data
“m_reporttype numeric(18,6),\n” // LONG m_reporttype; // 报告类型:年报、中报、季报
“m_fErate_dollar numeric(18,6),\n” // float m_fErate_dollar; // 当期美元汇率
“m_fErate_hkdollar numeric(18,6),\n” //float m_fErate_hkdollar; // 当期港币汇率 –// ★偿债能力
“m_fRatio_liquidity numeric(18,6),\n” // float m_fRatio_liquidity; // 流动比率
“m_fRatio_quick numeric(18,6),\n” // float m_fRatio_quick; // 速动比率
“m_fVelocity_receivables numeric(18,6),\n” // float m_fVelocity_receivables; // 应收帐款周率–// ★经营能力
“m_fVelocity_merchandise numeric(18,6),\n” // float m_fVelocity_merchandise; // 存货周转率
“m_fMain_income numeric(18,6),\n” // float m_fMain_income; // 主营业务收入
“m_fCash_ps numeric(18,6),\n” // float m_fCash_ps; // 每股净现金流量–// ★盈利能力
“m_fProfit_margin numeric(18,6),\n” // float m_fProfit_margin; // 主营业务利润率 %
“m_fNetasset_yield numeric(18,6),\n” // float m_fNetasset_yield; // 净资产收益率 %
“m_datebegin datetime,\n” // DWORD m_datebegin; // 上市日期 Format is YYYYMMDD-// ★资本结构
“m_fShare_count_total varchar(20),\n” // float m_fShare_count_total; // 总股本
“m_fShare_count_a varchar(20),\n” // float m_fShare_count_a; // 流通A股
“m_fShare_count_b varchar(20),\n” //float m_fShare_count_b; // 流通B股
“m_fShare_count_h varchar(20),\n” //float m_fShare_count_h; // 流通H股
“m_fShare_count_national varchar(20),\n” //float m_fShare_count_national; // 国有股
“m_fShare_count_corp varchar(20),\n” //float m_fShare_count_corp; // 法人股
“m_fProfit_psud varchar(20),\n” //float m_fProfit_psud; // 每股未分配利润
“m_fAsset varchar(20),\n” //float m_fAsset; // 总资产
“m_fRatio_holderright varchar(20),\n” //float m_fRatio_holderright; // 股东权益比率
“m_fRatio_longdebt varchar(20),\n” //float m_fRatio_longdebt; // 长期负债率
“m_fRatio_debt varchar(20),\n” //float m_fRatio_debt; // 资产负债率–// ★投资收益能力
“m_fNetasset_ps varchar(20),\n” //float m_fNetasset_ps; // 每股净资产
“m_fNetasset_ps_regulate varchar(20),\n” //float m_fNetasset_ps_regulate; // 调整每股净资产
“m_fEps varchar(20),\n” //float m_fEps; // 每股收益
“m_fEps_deduct varchar(20),\n” //float m_fEps_deduct; // 扣除后每股收益
“m_fNet_profit varchar(20),\n” //float m_fNet_profit; // 净利润
“m_fMain_profit varchar(20),\n” //float m_fMain_profit; // 主营业务利润
“m_fTotal_profit varchar(20),\n” //float m_fTotal_profit; // 利润总额–// ★增长率
“m_fProfit_inc varchar(20),\n” //float m_fProfit_inc; // 主营利润增长率%
“m_fIncome_inc varchar(20),\n” //float m_fIncome_inc; // 主营收入增长率%
“m_fAsset_inc varchar(20),\n” //float m_fAsset_inc; // 总资产增长率%” –// ★技术数据统计值
“m_fYield_average varchar(20),\n” //float m_fYield_average; // 平均收益率%
“m_fYield_stddev varchar(20),\n” //float m_fYield_stddev; // 收益标准差%
“m_fBeite varchar(20),\n” //float m_fBeite; // β值
“m_dwReserved1 varchar(8),\n” // DWORD m_dwReserved[4];
“m_dwReserved2 varchar(8),\n” //
“m_dwReserved3 varchar(8),\n” //
“m_dwReserved4 varchar(8),\n” //
“) \n”; //

nflase += CnnExecuteSql(sSql, true);

sSql.Format(“insert into STK_LOG (m_date, m_Updated, m_nCount, m_wMarket, m_szLabel, m_Type)”
“select GETDATE(),’SYSTEM’, %d, ”,”,’连接,更新数据表'”,nflase);
nflase += CnnExecuteSql(sSql,true);

return nflase;
}

改写代码为策略为王TSKING (源代码) 增加 SQL存储二 <写代码>

首先项目要加入SQL 支持

打开StkLib 中 StdAfx.h,加入

#ifndef _AFX_NO_STKLIBAFXADO_SUPPORT
#import “c:\program files\common files\system\ado\msado15.dll” \
no_namespace \
rename (“EOF”, “adoEOF”)
#define _AFX_NO_STKLIBAFXADO_SUPPORT
#endif

在项目StkLib中添加类 CStkLibWnd, 即添加了 StkLibWnd.h 与 StkLibWnd.cpp 两个文件

////////////////    StkLibWnd.h  /////////////////

#if !defined(AFX_StkLibWnd_H____INCLUDED_)
#define AFX_StkLibWnd_H____INCLUDED_
#if _MSC_VER > 1000
#pragma once
#endif
#include “StdAfx.h”

class CStkLibWnd;
STKLIB_API CStkLibWnd& AfxGetCStkLibWnd(); //参考工程中其它项目的实例化,以后可以直接调用

struct COMM_PACKET;

class STKLIB_API CStkLibWnd //: public CWnd
{

public:
CStkLibWnd();
virtual ~CStkLibWnd(); //析构
bool test();  //用来测试

};

#endif

////////////////    StkLibWnd.cpp  /////////////////

#include “StkLibWnd.h”
//
#ifdef _DEBUG
#define new DEBUG_NEW
#undef THIS_FILE
static char THIS_FILE[] = __FILE__;
#endif

CStkLibWnd &AfxGetCStkLibWnd()
{
static CStkLibWnd g_stStkLibwnd;
return g_stStkLibwnd;
}

 

bool CStkLibWnd::test()
{
return true;
}

CStkLibWnd::CStkLibWnd()
{

}

CStkLibWnd::~CStkLibWnd()
{
}

//////

为了测试,修改Database.cpp文件,测试,能否正常运行

首先 SelfDB.h 加入相关头文件  #include “StkLibWnd.h”

修改 int CStDatabase::LoadCodetable( CStockContainer & container ) 函数

加入一行

bool bFlag = AfxGetCStkLibWnd().test();

如果编辑与运行正常通过,表示,编写方法正确,以后调整 读取文件的方法,只需要调用 AfxGetCStkLibWnd().同构函数,就可以了。

有人问为什么不直接改写其中一个钱龙的格式或FXJ的格式变成sql数据库,这里是个人经验,因为是派生类修改麻烦

class CSelfDB : public CQianlong  = 》  class CQianlong : public IStStore
你要么就要改写全部,要么就编译不通过,当然,我也不是高手,如果有人有更方便的方法,请告诉我,QQ或者发邮件都可以, 不胜感激。