找回密码
 注册
搜索
查看: 4256|回复: 0

[转载]软件开发中几个常用功能的实现

[复制链接]
发表于 2004-12-24 13:37:04 | 显示全部楼层 |阅读模式
介绍
& s) S- i* p, h4 q% [; q在各个技术论坛中间,常常见到很多软件开发中提到的最多的基本问题,现在进行列举出来,希望对各位有用。 # o9 A2 ~* W+ ]7 _3 \

3 X9 a4 O$ U. R8 G' X正文( ?; ^' B, c3 F
在进行软件开发过程中间,有很多小功能的实现,虽然这些东西你可以不用,但是如果应用仂将会是你的程序更具有专业性。# V- V# n( L7 h8 V6 J1 ~' R
一、设置程序自动运行。/ p) k6 }& j; t+ y) w8 V
    很多监控软件要求软件能够在系统重新启动后不用用户去点击图标启动项目,而是直接能够启动运行,方法是写注册表SoftwareMicrosoftWindowsCurrentVersionRun。参考程序可以见下:(查找程序目录的执行文件,存在则进行添加注册表操作)
, o$ U/ x0 z- K2 x5 ]         HKEY RegKey;
4 s. i6 o1 S2 M, @8 d4 o         CString sPath;
) w1 L# T2 ]4 b0 s6 Z$ n% P         GetModuleFileName(NULL,sPath.GetBufferSetLength(MAX_PATH+1),MAX_PATH);. Z( P5 Q2 Q* a% N
         sPath.ReleaseBuffer();
* j9 {" s) d( b' G         int nPos;
5 s/ [! N+ d: p1 n4 i( I/ q    nPos=sPath.ReverseFind(’’);
- C3 ]1 R- [' O* U+ G: G: U    sPath=sPath.Left(nPos);
& L2 t' N' y8 w    CString lpszFile=sPath+"****.exe";//这里加上你要查找的执行文件名称$ O, z( L# ~9 E2 j6 s! B
    CFileFind fFind;
! f/ H& T' W3 I* w$ s    BOOL bSuccess;
6 C- @* W: \+ }    bSuccess=fFind.FindFile(lpszFile);$ H/ P' W  |' U
    fFind.Close();6 C8 R3 F) h0 i6 P$ O- ~% \/ D6 {
    if(bSuccess)% U: W' O/ ?. _8 x$ g
    {
$ V4 D* Z! d0 j4 [- o        CString fullName;' v7 G1 O. U8 |  M8 y# D: r5 B
        fullName=lpszFile;
. c  V- K2 i$ l/ ~4 Q/ K$ k        RegKey=NULL;
) p! H, B) _$ `5 }4 O) w5 ~        RegOpenKey(HKEY_LOCAL_MACHINE,"SoftwareMicrosoftWindowsCurrentVersionRun",&RegKey);$ O& d; ^' g% S
        RegSetValueEx(RegKey,"*****",0,REG_SZ,(const unsigned char*)(LPCTSTR)fullName,fullName.GetLength());//这里加上你需要在注册表中注册的内容8 D" \, a/ F* y6 i! P
        this->UpdateData(FALSE);
2 q( r! s: d% l2 S' b/ \# \0 N    }
8 b7 E  m- H* [) U5 B) T    else
, x# V2 i* \' A2 p% ]: e0 e! a: Z    {) N; T; d0 e" O, t9 b
        theApp.SetMainSkin();
; }. D% q1 S+ l        ::AfxMessageBox("没找到执行程序,自动运行失败");
2 V' `+ A' J) M! [( g. Y        exit(0);# J. Q, R2 L) n8 g& [
    }
8 }! r; x7 u  @0 D  m
. i. u+ j/ t  m9 T" @0 s4 M二、自动配置数据源
8 K/ Y; ?1 ^- T1 @+ e, Q5 @3 A3 g& e    很多的程序都要用到数据库结合的操作,这里举例ACCESS,因为ACCESS在中小型VC系统开发中是最常用到的,如果程序的移植,如果对于很初级的用户来说,你还需要他到配置面板中进行数据源配置的话,那就有点说不过去了。
6 l% S7 \; r/ ~         #include <odbcinst.h>
7 d# Z! z  g. ~+ i8 }8 p2 A" F         //配置数据源,数据库在应用程序目录下,这里比如数据库文件名为***.mdb,程序运行时候可以将数据库文件拷贝到程序目录下面。
. H2 E& ?9 M0 L7 T4 \    CString sPath;
, [5 C0 T6 z; K3 n, ~' ?5 ]    GetModuleFileName(NULL,sPath.GetBufferSetLength (MAX_PATH+1),MAX_PATH);# \% g) V! d/ @- C* v
    sPath.ReleaseBuffer();
. J8 U$ m& g0 h4 _! i! k$ F    int nPos;, q: a& _" p% L5 s
    nPos=sPath.ReverseFind(’’);
, t# z8 U; c2 i    sPath=sPath.Left(nPos);) s" s3 t  P$ J* V1 _9 M
    CString lpszFileName = sPath + "***.mdb";//这里修改成你的数据库文件名称- k: G. J( ?  l7 B! ]
    CFileFind  fFind;! U' N" T& W+ |1 T1 k
    if(!fFind.FindFile(lpszFileName))
) B+ L1 k: j9 T  I' y% f    {$ D6 g: }- X1 y
        ::AfxMessageBox("没有找到数据库");
$ o  d4 V, k+ Q        exit(0);/ t- v! F; {) X& G, S
    } % U$ L! o2 j, j/ X) z
    CString szDesc;6 c) c* F7 H3 N$ ]1 l. Z
    szDesc.Format( "DSN=****;Description=****;DESCRIPTION=The DataBase For ***;FIL=MicrosoftAccess;DEFAULTDIR=%s;DBQ=%s;" ,sPath,lpszFileName);//这里***号可以添加成你的描述
2 D; O( j2 i# @7 W2 X/ {
8 B' v) ^4 b% U$ g# Q! C    //添加数据源# G! N# ]- s0 R
    if(!::SQLConfigDataSource(NULL,ODBC_ADD_DSN, "Microsoft Access Driver (*.mdb)",(LPCSTR)szDesc))% A( V$ Z% Q: g0 r* i- H
    {0 J& s" c9 R1 c! V8 ]# m5 i# |
        ::AfxMessageBox("32位ODBC数据源配置错误!");5 ]& c/ E2 H1 k' C5 e, U& y: u
        exit(0);
. Q+ h2 X1 ~+ M9 K7 e- e    }9 A7 f( J, p2 e( O
0 ~2 z) T! h- B- l  d3 Y
三、设置显示模式:
. f6 M/ s# @5 I/ J2 O7 ^    很多的程序的移植的运行环境是改变的。有可能你的原来开发环境是1024X768,但是到了那些显示器大于17的时候(分辨率超过你的开发时的分辨率时),程序的显示可能就不好看了。4 w' b# _5 B! s% C3 U- O3 S0 {9 n- v
         DEVMODE lpDevMode;
# |& t( a* O  I( z+ m! p+ s    lpDevMode.dmPelsHeight=768;//Y方向象素点0 @+ P3 V8 v5 Q
    lpDevMode.dmPelsWidth=1024;//X方向象素点7 @  H) z. M0 i
    lpDevMode.dmDisplayFrequency=85;//屏幕刷新率/ V/ e, r: L. Q$ v6 u' F
    lpDevMode.dmFields=DM_PELSWIDTH|DM_PELSHEIGHT|DM_DISPLAYFREQUENCY;) h: U3 I. }( {* ?
    ChangeDisplaySettings(&lpDevMode,0);# V0 R$ ~4 v1 a1 a, l/ g! {* N
4 j9 B: v" [( W( t& G- E
四、在你的程序中间加载其他应用程序:5 b* ?+ S. V. s; S9 z7 ?/ h5 W+ T, @
    你的程序除了调用到各个模块进行协同工作外(DLL),还有可能调用不是同一个开发环境下的应用程序,比如VC环境下调用DELPHI,VB开发的执行程序,你就可以用到下面的方法(将调用的应用程序拷贝程序目录中):/ v! K/ L4 t+ X& D0 {9 _7 d
         CString sPath;
; R" j/ \" i# p) ^* [8 C    GetModuleFileName(NULL,sPath.GetBufferSetLength (MAX_PATH+1),MAX_PATH);: S, f/ S! M% b: ~- ~8 D- X
    sPath.ReleaseBuffer();
$ I; p+ m' C8 _! P/ H: K/ U    int nPos;
( e5 G4 ]9 T8 m2 K. W! Y$ @' E9 r    nPos=sPath.ReverseFind(’’);
% g+ B4 v2 D3 y5 v$ a2 V    sPath=sPath.Left(nPos);( C  e$ B, s% @$ A6 N8 A
    CString lpszFileName = sPath + "***.exe";//这里修改成你的调用应用程序的文件名称4 H0 C6 N, @! ^% U% `  P- |. F- Z
    CFileFind  fFind;& g6 C( D2 A" J/ u7 t3 V9 U4 m
    if(!fFind.FindFile(lpszFileName))
* h& U9 {9 r: s) c" D$ h    {
: d+ T7 v: P7 [. V9 f& W        ::AfxMessageBox("没有找到调用的应用程序!");
% W- Y0 O% {! j5 [6 C        return FALSE;$ E& u, G2 H& [6 o, P
    }) B. G) `3 ]5 s8 \
    else1 X. N2 b' S% b1 l9 k
        ShellExecute(NULL,NULL,_T("***.exe"),NULL,sPath,NULL);
$ R, e* {( L8 q: X- }' {. @, p# C6 Q) L8 [, I* \' J) ^
五、结束进程:
, l/ O' ]" d: J0 F. _$ v# q( ~1 ^: u    在你的程序中结束别的程序进程,采用的方法是进行进程列举,然后采用查找的方法进行:
$ E' B# t/ C: x3 h1 `: q         #include "TLHELP32.H"% D3 W) J' ]) b
         DWORD ProcessID[50];0 z4 N& _, D7 O) {
    CString kkk[50];
) a/ G8 E$ d3 S# t4 N; [$ W    HANDLE SnapShot=CreateToolhelp32Snapshot(TH32CS_SNAPPROCESS,0);
* ?8 Z7 g* z$ ^+ d( {6 H    PROCESSENTRY32* info=new PROCESSENTRY32;
4 u- [$ V5 Y  O* ~1 s    PROCESSENTRY32 ProcessInfo;//声明进程信息变量. e) d  b' R* L* C  `( k
    ProcessInfo.dwSize=sizeof(ProcessInfo);//设置ProcessInfo的大小
' O- z# k, B. o' \/ }  O3 C    //返回系统中第一个进程的信息
! D% ]9 e9 z3 t    BOOL Status=Process32First(SnapShot,&rocessInfo);
0 |- m3 g9 @$ J' u/ F    int m_nProcess=0; / z/ d7 Q# q! R: B/ `# J4 o
    while(Status)
2 K- H" R1 b3 Z0 O  g    {  \& |- A2 f' }' r, t
        CString s,str1,str2;) x4 e# g0 h( I  Q) ], z. B
        s.Format("%d",ProcessInfo.cntThreads);0 [2 [0 X. F* V# N5 Z. U. p
        str1.Format("%s",ProcessInfo.szExeFile);( A* i$ a; S+ o5 L5 {4 ~: H% U
        str1=ProcessInfo.szExeFile;
! L1 ?& P( B, U7 r& i* l        kkk[m_nProcess]=ProcessInfo.szExeFile; . ?) q7 Z! j$ l# F
        ProcessID[m_nProcess]=ProcessInfo.th32ProcessID; 5 K# s' B# {1 v- h! K8 b: K
        if(str1=="***.exe")//***.exe就是你要结束的进程的名称- y; @( k) T3 u  u( C
        {
/ Y( P+ s1 h5 I0 i, ^) s! X" [            HANDLE ProcessHandle;
0 T9 b& F0 Y% i' A            ProcessHandle=OpenProcess (PROCESS_ALL_ACCESS,FALSE,ProcessID[m_nProcess]);
$ d/ k* Y# n" b6 w  U9 _8 o            TerminateProcess(ProcessHandle,0);    & j& W# c) k/ L* w
        }
9 Q3 {0 _; R6 B* V8 H4 x        Status=Process32Next(SnapShot,&rocessInfo);8 ^  ]# d8 X4 [, J: g) j. ?) |: R
        m_nProcess++;
- b! F7 X7 y0 j( ]) u( g" D# @/ a    }
4 R$ _5 S6 E* _) o8 ^1 L- b正文完
您需要登录后才可以回帖 登录 | 注册

本版积分规则

Archiver|手机版|小黑屋|宁德市腾云网络科技有限公司 ( 闽ICP备2022007940号-5|闽公网安备 35092202000206号 )

GMT+8, 2026-6-18 06:53 , Processed in 0.018101 second(s), 15 queries .

Powered by Discuz! X3.5

© 2001-2025 Discuz! Team.

快速回复 返回顶部 返回列表