您的位置:首页 > 编程语言

Pro*C编程初步 + 栽在了一个非常简单的问题上

2008-12-19 20:57 281 查看
搞了好长时间,总算编译过去了……

Pro*C程序好像就是用C语言来操作ORACLE数据库的程序(有待考证;-) )

Pro*C程序一般是以pc为后缀的,ORACLE也提供了预编译程序,可以将这些SQL语句之类的都预编译成C或C++程序,然后再编译相应的C/C++程序,生成可执行文件

要将pc编译成cpp文件,要使用proc程序:

它的命令用法如下:

proc iname=filename [Option_name1=vatue1 Option_name2=vatue2....]

如:pc文件名为dbop.pc

编译为CPP的命令为:

proc iname=dbop.pc oname=dbop.cpp code=cpp ltype=none

它后面的选项的意思分别为:

iname: 输入项名字

oname:输出项名字

code=cpp : 表示编译成C++程序,此项还可以是Ansi_c, Kr_c

ltype=none : 表示不生成中间的lst文件

proc的可选项还很多,如include、sqlcheck、threads等

如果没有语法错误,就已经生成了cpp文件

此时就像编译平常的c++程序了,不过要加上一些特定的库,否则会出现某些东西未定义的错误

用g++编译的命令如下:

g++ -g -Wall -L ORACLE_HOME/lib -l clntsh dbop.cpp -o dbop

此时就生成了dbop可执行程序

./dbop就可以运行了

下面是一个简单的makefile文件

NAME=dbop

PC=$(NAME).pc

CPP=$(NAME).cpp

PROC_FLAG=code=cpp ltype=none

CC_FLAG=-g -Wall -L ${ORACLE_HOME}/lib -l clntsh

$(NAME): $(CPP)

g++ $(CC_FLAG) $(CPP) -o $(NAME)

$(CPP): $(PC)

proc $(PROC_FLAG) iname=$(PC) oname=$(CPP)

clean:

rm -f *.cpp

我现在也是仅仅编译过了,数据库连接的时候总是出错,有待继续……

不过今天早上发现了有史以来最大的一个盲区……,绝对的盲区~~~

要设置某对话框上按钮的背景图,所以,想响应WM_CTLCOLORBTN,以前还没用过,只知道接到这个消息的时候,返回Brush就行,而且此时控件必须为自绘才行
但画出来之后,背景是改变了,但是文字的后面不是透明的,文字仍然是放在了一块白色的方块上,太难看了~~~
我明明用SetBkMode来设置了呀,怎么会不行呢?
开始我还以为自绘的按钮比较特别,可能不能这样用,但后来仍然没能解决~
但我仍坚信代码没有问题,即使是调试,都不知道往哪儿调……
但后来一步一步走下去,才终于发现,这么一个简单的问题,我竟然一直都不知道,好像也没在哪儿见到过……

我的代码是这样的:
switch(wParam)
{
SetBkMode(...);
case IDC_BEGIN:
DoSomething(...);
break;
case IDC_STOP:
DoOtherthings(...);
break;
}
我一直坚信代码会顺序往下执行,SetBkMode会正常执行,然后再在下一句判断wParam的值,而且我即使调试的时候也是直接在case后面下断点,也不知道SetBkMode执行没。
后来我把断点下在了switch外面,然后单步走,才发现,根本就不会执行SetBkMode,这才发现问题!!!

昨天晚上还有同学问我一个关于switch的简单问题,我给他说肯定×××,口气好像是说,怎么如此简单的问题都要问一下
但今天早上解决的这个问题却出在了这儿,其实这个问题也是在昨天晚上碰到的,当时没能解决,今天早上才解决,发现之后,当时就感觉眩晕~~~

估计编译器把switch语句汇编成如下的形式了
mov eax, wParam
cmp eax, IDC_BEGIN
jz lab1
cmp eax, IDC_STOP
jz lab2
jmp lab3 ;default
invoke SetBkMode, ,
lab1:
........
jmp lab4
lab2:
......
jmp lab4
lab3:
......
lab4:
……

以上代码纯属猜测,我的人脑编译出来的,非常不可靠 ;-)

我记得以前从来没有见到过呀,好像以前学C语言的时候也没在书上看到过,自认为很简单的一个问题,没想到就裁到这上面了。

呵呵,一个简单的问题,我竟然长篇大论的乱讲一通,不过,我以前确实不知道……
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐