-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathsqlite3笔记.txt
371 lines (257 loc) · 14.5 KB
/
sqlite3笔记.txt
1
2
3
4
5
6
7
8
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
vc6编程 操作sqlite3 3.11做数据纪录 解决淘宝客服数据问题
20190221
寻到vc6 英文版本安装,然后到微软网站下载 vc6sp6打补丁,可以解决open add files异常问题。
今天顺利编译sqlite3 3.11版本 exe文件解决了编译出故障问题
纪录:
在http://www.sqlite.org/2016/sqlite-amalgamation-3110000.zip 下载后,这个amalgamation是sql的独立源文件,包含c h 和shell.c文件老的版本没有shell.c
在利用vc6时候 cl编译它出exe 缺省命令如下:
cl shell.c sqlite3.c -Fesqlite3.exe
我加了小开关 -w 过滤warning
报错
Microsoft (R) 32-bit C/C++ Optimizing Compiler Version 12.00.8804 for 80x86
Copyright (C) Microsoft Corp 1984-1998. All rights reserved.
shell.c
sqlite3.c
Generating Code...
Microsoft (R) Incremental Linker Version 6.00.8447
Copyright (C) Microsoft Corp 1992-1998. All rights reserved.
/out:sqlite3.exe
shell.obj
sqlite3.obj
sqlite3.obj : error LNK2001: unresolved external symbol __beginthreadex
sqlite3.obj : error LNK2001: unresolved external symbol __endthreadex
sqlite3.exe : fatal error LNK1120: 2 unresolved externals
分析原因,可能和线程的某些设定有关系,看
https://www.sqlite.org/howtocompile.html 原文思路不多,在百度查 error LNK2001: unresolved external symbol __beginthreadex vc6
得到
线程运行时库设置错误, 提示:nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __beginthreadex
nafxcwd.lib(thrdcore.obj) : error LNK2001: unresolved external symbol __endthreadex这是因为MFC要使用多线程时库, 需要更改设置:
[Project] --> [Settings] --> 选择"C/C++"属性页, 在Category中选择Code Generation,再在Use run-time library中选择Debug Multithreaded或者multithreaded
其中, Single-Threaded 单线程静态链接库(release版本)
Multithreaded 多线程静态链接库(release版本)
multithreaded DLL 多线程动态链接库(release版本)
Debug Single-Threaded 单线程静态链接库(debug版本)
Debug Multithreaded 多线程静态链接库(debug版本) )
Debug Multithreaded DLL 多线程动态链接库(debug版本)
单线程: 不需要多线程调用时, 多用在DOS环境下
多线程: 可以并发运行
静态库: 直接将库与程序Link, 可以脱离MFC库运行
动态库: 需要相应的DLL动态库, 程序才能运行
release版本: 正式发布时使用
debug版本: 调试阶段使用
分析 估计由于cl 开关里面有这个设置 多线程的选项,
cl /?
得到如下
-LINKING- 这个部分是链接部分,有中文解释
/MD link with MSVCRT.LIB /MDd link with MSVCRTD.LIB debug lib
/ML link with LIBC.LIB /MLd link with LIBCD.LIB debug lib
/MT link with LIBCMT.LIB /MTd link with LIBCMTD.LIB debug lib
/LD Create .DLL /F<num> set stack size
(press <return> to continue)
/LDd Create .DLL debug libary /link [linker options and libraries]
/MD : 使用 MSVCRT.lib 创建多线程 DLL
/ML : 使用 LIBC.lib 创建单线程可执行文件
/MT : 使用 LIBCMT.lib 创建多线程可执行文件
所以改进 原来的编译命令
cl -w /MT shell.c sqlite3.c -Fesqlite3.exe 这样就可以编译出exe运行文件 即可以运行在多线程下的文件。
这里需要注意的原来的sqlite3 3.11版本的文件设定很好不需要再重复设定文件本身。
同理 产生dll文件
cl -w /MD sqlite3.c -link -dll -out:sqlite3.dll 这个可以生成dll文件
cl -w /MD sqlite3.c /link -dll /DEFAULTLIB:msvcrt.lib -out:sqlite3.dll ---高版本cl 有-dll开关 vc6不可以
/link最后的这个开关 必须在其他开关最后, 相当于 把后面参数传给link.exe来使用
类似 cl.exe运行后 运行link.exe
但是这种dll 无法像是官网下的dll可以导出def
如果没def 有dll
dumpbin /exports sqlite3.dll > exports.txt
echo LIBRARY SQLITE3 > sqlite3.def
echo EXPORTS >> sqlite3.def
for /f "skip=19 tokens=4" %A in (exports.txt) do echo %A >> sqlite3.def
先导出def文件
利用原文件的
http://www.sqlite.org/2016/sqlite-dll-win32-x86-3110000.zip
里面 dll def文件可以生成 lib文件 方便编译 可直接放入自己vc工程
lib /def:C:\path\to\sqlite3.def /out:C:\path\to\sqlite3.lib /machine:x86
lib /def:sqlite3.def /out:sqlite3.lib /machine:x86
另外直接vc6 ide编译 dll lib 依赖def,
在SETTING里面预编译项目中 加入
SQLITE_ENABLE_RTREE,SQLITE_ENABLE_COLUMN_METADATA,THREADSAFE,
避免error生成 dll lib
这个过程是下载 http://www.sqlite.org/2016/sqlite-dll-win32-x86-3110000.zip 和 http://www.sqlite.org/2016/sqlite-amalgamation-3110000.zip
解压def 和 后面的c h文件到一个msvc dll 空工程里面 空的dll工程。 在source head文件夹里面分别加入文件,resource里面加入def。
编译整个工程
出现 debug release版本的 dll lib就好了,记得前面在工程setting里面 预编译开关要放入三个参数,其他的参数可以参考官网来设定。
注意sqlite可以程序上直接做库 建表,无需tcp的link端口操作,感觉像是写文件,很方便。
所以dll是为了自己的mfc文件可以调用,sqlite3.exe是库文件自己可以用来使用试验,还有一些tool http://www.sqlite.org/2016/sqlite-tools-win32-x86-3110000.zip
除了sqlite3.exe 还有分析和 sqldiff。
任务
1 数据增删改
2 建库 建表 删表
3 设计纪录的表内容
运单发出纪录, 运单完成纪录, 回复模板 (发货 售后 )要和运单号关联,生成自动回复message
计算利润, 运输成本 依靠小票,
通知信息,发货
查询 日期,淘宝id,货物内容,
网站查询 sureton 反馈消息过滤运单, 输入用户id 对应运单查结果, 结果过滤ems单号
网站查询 ems查询 api 反馈结果
要了解vc中使用#include命令包含头文件所搜寻的路径,必须先了解vc中的几种路径:
1. 系统路径
系统路径在vc中是"Tools->Options->Directories"中"Include files"指定的路径。
打开此对话框会发现默认有这几条路径:
C:\Program Files\Microsoft Visual Studio\VC98\INCLUDE
C:\Program Files\Microsoft Visual Studio\VC98\MFC\INCLUDE
C:\Program Files\Microsoft Visual Studio\VC98\ATL\INCLUDE
我们可以在这里添加,这样我们自己添加的路径也会成为系统路径。添加的格式必须按照上面来写。
2. 当前路径
当前路径是指vc工程中工程文件所在的路径,即.dsw文件所在路径。
网上有很多朋友说,当前路径是指.cpp文件所在路径,经过测试,这个说法也是正确的。但是使用vc编译时,是不正确的。
3. 附加路径
附加路径是指在"Project->Settings->C/C++->Preprocessor->Additional include directories "中指定的路径。
此路径默认为空,我们可以在此处填写需要路径,比如:在此处填入"C:\123\",(不要引号),那么附加路径就会变成"C:\123\" 。
上面的1,3路径,我们均可以自己编辑。在编辑过程中,可以使用绝对路径,也可以使用相对路径。
比如,在添加系统路径时,可以这样填写:
.\SRC\ 这样写表示,当前目录中的SRC文件夹;
..\SRC\ 这样写表示,当前目录的上一层目录中SRC文件夹;
...\SRC\ 这样写表示,当前目录下 ..\SRC\\ 路径,当然这种写法已经和第一种重叠了。
这种相对路径的写法,vc会自动帮我们转化为绝对路径。
在添加附加路径时,其相对路径的写法和系统路径是一致的。
在vc中使用#include 命令,有三种形式:
1. #include <file.h>
vc执行这条指令时,它会在系统目录中去查找 file.h 文件。
在此条码命令中,vc不会去当前路径和附加路径中查找文件。
2. #include "file.h"
vc执行这条指令时,它首先会搜索附加路径,如果没有则会搜索系统路径,如果还没有则会去搜索当前路径。
3. #include "directory\file.h"
vc执行这条指令时,它会去指定的路径去查找文件,如果没找到,它不会继续查找。
vc6 系统目录 include lib 在 tools->options->directory
/Yu"stdafx.h" 在测试例子的里面去掉 c++/c 编译的这个预编译头设置,就一切ok
我怀疑是在sqlitecpp.lib文件编译时候 我已经有stdafx.h的相关东西了。
Ultimate toolbox 中文环境 vc6的一些编译设置 路径设置问题
1、目前Ultimate Toolbox只支持到vc2005,所以开始在vc2008下面怎么调试都不行,网上有关于在vc2008下面使用的升级包,但却是beta版的,等以后有稳定版了再说。
2、vc6.0里面的这个文件有bug,wabtags.h,是因为里面含有0xA0这个不可打印字符,英文中没问题,但是在中文中就显示不出来,造成了整个wabtags.h文件的混乱。解决方法就是用十六进制方式打开此文件,然后把所有的A0都替换成20就行
3、UT在vc6.0中使用时要遵守以下步骤:
a:在工程属性的C/C++选项卡里,选择预处理器,把UT下的include目录的绝对路径添加进去。
b:在连接选项卡里,选择常规,把UT下lib/Libs/里面相应的lib文件添加进来。这跟工程如何使用mfc库,还有debug/release版本有关。
c:在资源选项卡中,附加资源包含路径填上UT里面的include目录。
d:然后才可以按照手册上说的,在StdAfx.h里面#include "UTStaticLib.h"。在资源包含里#include "OXMain.rc"。还有最重要的一点,在资源包含里要把#pragma code_page(936)改成#pragma code_page(1252),这是因为UT里面的资源都是美国的,所以不能用中国的code page。
这样就可以正常使用UT中的300多个类库了,记得使用的时候包含头文件和资源文件。
4、vc6.0里的error RC1121是说资源文件读取失败,原因可能是资源文件不存在、路径错误,也可能是上面提到的资源文件使用的code page跟程序不一致
5、vc6.0里的error LNK2001多半是因为连接时要使用的库文件没有包含进来,就像上面说的要在工程属性的连接选项卡里添加所需的.lib文件一样
转换文件编码 命令
for /r "C:\cproject\testcode\UltimateToolbox93_src\UltimateToolbox\include\" %i in (*.h) do iconv.exe -f WINDOWS-1252 -t UTF-8 %i > include\%~ni.utf8
for /r "C:\cproject\testcode\UltimateToolbox93_src\UltimateToolbox\source\" %i in (*.cpp) do iconv.exe -f WINDOWS-1252 -t UTF-8 %i > source\%~ni.utf8
del source\*.cpp
rename source\*.utf8 *.cpp
修改samples下所有cpp编码属性
for /r "C:\cproject\testcode\UltimateToolbox93_samples\UltimateToolbox\" %i in (*.cpp) do iconv.exe -f WINDOWS-1252 -t UTF-8 %i > %i.utf8
del source\*.cpp
rename source\*.utf8 *.cpp
C:\cproject\testcode\UltimateToolbox93_samples\UltimateToolbox\samples\advanced\SkinsDemo
对一组文件中的每一个文件执行某个特定命令。
FOR %variable IN (set) DO command [command-parameters]
%variable 指定一个单一字母可替换的参数。
(set) 指定一个或一组文件。可以使用通配符。
command 指定对每个文件执行的命令。
command-parameters
为特定命令指定参数或命令行开关。
在批处理文件中使用 FOR 命令时,指定变量请使用 %%variable
而不要用 %variable。变量名称是区分大小写的,所以 %i 不同于 %I.
如果命令扩展名被启用,下列额外的 FOR 命令格式会受到
支持:
FOR /D %variable IN (set) DO command [command-parameters]
如果集中包含通配符,则指定与目录名匹配,而不与文件
名匹配。
FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters]
检查以 [drive:]path 为根的目录树,指向每个目录中的
FOR 语句。如果在 /R 后没有指定目录,则使用当前
目录。如果集仅为一个单点(.)字符,则枚举该目录树。
FOR /L %variable IN (start,step,end) DO command [command-parameters]
该集表示以增量形式从开始到结束的一个数字序列。
因此,(1,1,5) 将产生序列 1 2 3 4 5,(5,-1,1) 将产生
序列 (5 4 3 2 1)。
FOR /F ["options"] %variable IN (file-set) DO command [command-parameters]
FOR /F ["options"] %variable IN ("string") DO command [command-parameters]
FOR /F ["options"] %variable IN ('command') DO command [command-parameters]
或者,如果有 usebackq 选项:
FOR /F ["options"] %variable IN (file-set) DO command [command-parameters]
FOR /F ["options"] %variable IN ("string") DO command [command-parameters]
FOR /F ["options"] %variable IN ('command') DO command [command-parameters]
filenameset 为一个或多个文件名。继续到 filenameset 中的
下一个文件之前,每份文件都已被打开、读取并经过处理。
处理包括读取文件,将其分成一行行的文字,然后将每行
解析成零或更多的符号。然后用已找到的符号字符串变量值
调用 For 循环。以默认方式,/F 通过每个文件的每一行中分开
的第一个空白符号。跳过空白行。您可通过指定可选 "options"
参数替代默认解析操作。这个带引号的字符串包括一个或多个
指定不同解析选项的关键字。这些关键字为:
eol=c - 指一个行注释字符的结尾(就一个)
skip=n - 指在文件开始时忽略的行数。
delims=xxx - 指分隔符集。这个替换了空格和跳格键的
默认分隔符集。
tokens=x,y,m-n - 指每行的哪一个符号被传递到每个迭代
的 for 本身。这会导致额外变量名称的分配。m-n
格式为一个范围。通过 nth 符号指定 mth。如果
符号字符串中的最后一个字符星号,
那么额外的变量将在最后一个符号解析之后
分配并接受行的保留文本。
usebackq - 指定新语法已在下类情况中使用:
在作为命令执行一个后引号的字符串并且一个单
引号字符为文字字符串命令并允许在 filenameset
中使用双引号扩起文件名称。
某些范例可能有助:
FOR /F "eol=; tokens=2,3* delims=, " %i in (myfile.txt) do @echo %i %j %k
会分析 myfile.txt 中的每一行,忽略以分号打头的那些行,将
每行中的第二个和第三个符号传递给 for 程序体;用逗号和/或
空格定界符号。请注意,这个 for 程序体的语句引用 %i 来
取得第二个符号,引用 %j 来取得第三个符号,引用 %k
来取得第三个符号后的所有剩余符号。对于带有空格的文件
名,您需要用双引号将文件名括起来。为了用这种方式来使
用双引号,您还需要使用 usebackq 选项,否则,双引号会
被理解成是用作定义某个要分析的字符串的。
%i 专门在 for 语句中得到说明,%j 和 %k 是通过
tokens= 选项专门得到说明的。您可以通过 tokens= 一行
指定最多 26 个符号,只要不试图说明一个高于字母 'z' 或
'Z' 的变量。请记住,FOR 变量是单一字母、分大小写和全局的;而且,
同时不能有 52 个以上都在使用中。
您还可以在相邻字符串上使用 FOR /F 分析逻辑;方法是,
用单引号将括号之间的 filenameset 括起来。这样,该字符
串会被当作一个文件中的一个单一输入行。
最后,您可以用 FOR /F 命令来分析命令的输出。方法是,将
括号之间的 filenameset 变成一个反括字符串。该字符串会
被当作命令行,传递到一个子 CMD.EXE,其输出会被抓进
内存,并被当作文件分析。因此,以下例子:
FOR /F "usebackq delims==" %i IN (`set`) DO @echo %i
会枚举当前环境中的环境变量名称。
另外,FOR 变量参照的替换已被增强。您现在可以使用下列
选项语法:
~I - 删除任何引号("),扩充 %I
%~fI - 将 %I 扩充到一个完全合格的路径名
%~dI - 仅将 %I 扩充到一个驱动器号
%~pI - 仅将 %I 扩充到一个路径
%~nI - 仅将 %I 扩充到一个文件名
%~xI - 仅将 %I 扩充到一个文件扩展名
%~sI - 扩充的路径只含有短名
%~aI - 将 %I 扩充到文件的文件属性
%~tI - 将 %I 扩充到文件的日期/时间
%~zI - 将 %I 扩充到文件的大小
%~$PATH:I - 查找列在路径环境变量的目录,并将 %I 扩充
到找到的第一个完全合格的名称。如果环境变量名
未被定义,或者没有找到文件,此组合键会扩充到
空字符串
可以组合修饰符来得到多重结果:
%~dpI - 仅将 %I 扩充到一个驱动器号和路径
%~nxI - 仅将 %I 扩充到一个文件名和扩展名
%~fsI - 仅将 %I 扩充到一个带有短名的完整路径名
%~dp$PATH:i - 查找列在路径环境变量的目录,并将 %I 扩充
到找到的第一个驱动器号和路径。
%~ftzaI - 将 %I 扩充到类似输出线路的 DIR
在以上例子中,%I 和 PATH 可用其他有效数值代替。%~ 语法
用一个有效的 FOR 变量名终止。选取类似 %I 的大写变量名
比较易读,而且避免与不分大小写的组合键混淆。
20160301
凌晨完成 捕捉窗口代码调试 vc6通过,结合cximage, 速度据说不快 比freeimage但是转换足够好,
下一步 打水印 调尺寸在抓屏同时完成保存到目录 准备上传, 应该有个热键启动功能,开始抓
UltimateToolbox的界面部分可以直接使用skindemo 风格,下一步处理界面中捆绑数据处理
1 列表 显示 翻页 滚动
2 搜索 查询关键字
3 建表 增删改 testcode
需要在之前的数据库捆绑cpp包装的类上运行。