关于windows api的问题,达人进!

royantal 2002-09-02 03:41:42
文本文件名:app.ini
内容
[localconn]
lDBServerName = "njdept"
lDBDataName = "nhgsplan"
lDBUserName = "sa"
lDBPassword = ""

API声明语句:Public Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" _
(ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpDefault As String, ByVal _
lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long



api使用语句:str=GetPrivateProfileString("localconn", "lDBServerName", "",x, 64, App.Path & "\app.ini")
其中X为已定义的变量,64为大小

然后用msgbox str
显示出一个数字6,为什么不是njdept这个字符串?
...全文
31 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaoxinghappy 2002-09-04
  • 打赏
  • 举报
回复
你的类型想来是定义错了,因为你把 str来接收返回值,
其实返回值应是 Long 型的数据

Dim Ret as long
Dim strV as long ''为什么定义strV, 因为 str是VB自带的函数。

strV=space$(255)
Ret=GetPrivateProfileString("localconn", "lDBServerName", "",strV, 255, App.Path & "\app.ini")
strV = Left(strV, InStr(strV, Chr(0)) - 1)

strV 才是得到的值,而且要事先初始化。

yangwq99 2002-09-02
  • 打赏
  • 举报
回复
VB读写INI文件的四个函数
'文件名SourceDB.ini文件
Private Declare Function GetPrivateProfileString Lib "kernel32" Alias "GetPrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpDefault As String, ByVal lpReturnedString As String, ByVal nSize As Long, ByVal lpFileName As String) As Long
Private Declare Function WritePrivateProfileString Lib "kernel32" Alias "WritePrivateProfileStringA" (ByVal lpApplicationName As String, ByVal lpKeyName As Any, ByVal lpString As Any, ByVal lpFileName As String) As Long
'以下两个函数,读/写ini文件,固定节点setting,in_key为写入/读取的主键
'仅仅针对是非值
'Y:yes,N:no,E:error
Public Function GetIniTF(ByVal In_Key As String) As Boolean
On Error GoTo GetIniTFErr
GetIniTF = True
Dim GetStr As String
GetStr = VBA.String(128, 0)
GetPrivateProfileString "Setting", In_Key, "", GetStr, 256, App.Path & "\SourceDB.ini"
GetStr = VBA.Replace(GetStr, VBA.Chr(0), "")
If GetStr = "1" Then
GetIniTF = True
GetStr = ""
Else
GoTo GetIniTFErr
End If
Exit Function
GetIniTFErr:
Err.Clear
GetIniTF = False
GetStr = ""
End Function

Public Function WriteIniTF(ByVal In_Key As String, ByVal In_Data As Boolean) As Boolean
On Error GoTo WriteIniTFErr
WriteIniTF = True
If In_Data = True Then
WritePrivateProfileString "Setting", In_Key, "1", App.Path & "\SourceDB.ini"
Else
WritePrivateProfileString "Setting", In_Key, "0", App.Path & "\SourceDB.ini"
End If
Exit Function
WriteIniTFErr:
Err.Clear
WriteIniTF = False
End Function


'以下两个函数,读/写ini文件,不固定节点,in_key为写入/读取的主键
'针对字符串值
'空值表示出错
Public Function GetIniStr(ByVal AppName As String, ByVal In_Key As String) As String
On Error GoTo GetIniStrErr
If VBA.Trim(In_Key) = "" Then
GoTo GetIniStrErr
End If
Dim GetStr As String
GetStr = VBA.String(128, 0)
GetPrivateProfileString AppName, In_Key, "", GetStr, 256, App.Path & "\SourceDB.ini"
GetStr = VBA.Replace(GetStr, VBA.Chr(0), "")
If GetStr = "" Then
GoTo GetIniStrErr
Else
GetIniStr = GetStr
GetStr = ""
End If
Exit Function
GetIniStrErr:
Err.Clear
GetIniStr = ""
GetStr = ""
End Function

Public Function WriteIniStr(ByVal AppName As String, ByVal In_Key As String, ByVal In_Data As String) As Boolean
On Error GoTo WriteIniStrErr
WriteIniStr = True
If VBA.Trim(In_Data) = "" Or VBA.Trim(In_Key) = "" Or VBA.Trim(AppName) = "" Then
GoTo WriteIniStrErr
Else
WritePrivateProfileString AppName, In_Key, In_Data, App.Path & "\SourceDB.ini"
End If
Exit Function
WriteIniStrErr:
Err.Clear
WriteIniStr = False
End Function

yangwq99 2002-09-02
  • 打赏
  • 举报
回复
为了方便用户使用和使系统具有灵活性,大多数Win-dows应用程序将用户所做的选择以及各种变化的系统信息记录在初始化(INI)文件中。因此,当系统的环境发生变化时,可以直接修改INI文件,而无需修改程序。由此可见,INI文件对系统功能是至关重要的。本文将介绍采用VisualBasicforWindows(下称VB)开发Windows应用程序时如何读写INI文件。
  INI文件是文本文件,由若干部分(section)组成,在每个带括号的标题下面,是若干个以单个单词开头的关键词(keyword)和一个等号,每个关键词会控制应用程序某个功能的工作方式,等号右边的值(value)指定关键词的操作方式。其一般形式如下:

  [Section1]
  KeyWord1=Valuel
  KeyWord2=Value2
   ……
  [Section2]
  KeyWord1=Value1
  KeyWord2=Value2
   ……

  其中,如果等号右边无任何内容(即Value为空),那就表示Windows应用程序已为该关键词指定了缺省值,如果在整个文件中找不到某个关键词(或整个一部分),那同样表示为它们指定了缺省值。各个部分所出现的顺序是无关紧要的,在每一个部分里,各个关键词的顺序同样也无关紧要。

  读写INI文件通常有两种方式:一是在Windows中用“记事本”(Notepad)对其进行编辑,比较简单,无需赘述;二是由Windows应用程序读写INI文件,通常是应用程序运行时读取INI文件中的信息,退出应用程序时保存用户对运行环境的某些修改。

  关键词的值的类型多为字符串或整数型,应分两种情况读写。为了使程序具有可维护性和可移植性,最好把对INI文件的读写封装在一个模块(RWINI.BAS)中,在RWI-NI.BAS中构造GetIniS和GetIniN函数以及SetIniS和Se-tIniN过程,在这些函数和过程中需要使用WindowsAPI的“GetPrivateprofileString”、“GetPrivateProfileInt”和“WritePrivateProfileString”函数。

  RWINI.BAS模块的程序代码如下:

  在General-Declearation部分中声明使用到的WindowsAPI函数:

Public Declare Function GetprivateprofileString Lib“Kernel”(ByVal lpAppName As String,ByVal lpKeyName As _
  String,ByVal lpDefault As String,ByVal lpRetrm-String As String,ByVal cbReturnString As Integer, _
  ByVal Filename As String)As Integer
Public Declare Function GetPrivatePfileInt Lib“Kernel”(ByVal lpAppName As String,ByVal lpKeyName As String, _
  ByVal lpDefault As Integer,ByVal Filename As String)As Integer
Public Declare Funciton WritePrivateprofileString Lib“Kernel”(ByVal lpApplicationName As String, _
  ByVal lpKeyName As String,ByVal lpString As String,ByVal lplFileName As String)As Integer
Public Function GetIniS(ByVal SectionName As String,ByValKeyWord As String,ByVal DefString As String)As String
  Dim ResultString As String*144,Temp As Integer
  Dim s As String,i As Integer
  Temp%=GetPrivateProfileString(SectionName,KeyWord,"",ResultString,144,AppProfileName())
  ’检索关键词的值
  If Temp%>0 Then ’关键词的值不为空
  s=""
  For i=1 To 144
   If Asc(Mid$(ResultString,I,1))=0 Then
    ExitFor
   Else
    s=s & Mid$(ResultString,I,1)
   End If
  Next
  Else
  Temp%=WritePrivateProfilesString(sectionname,KeyWord,DefString,ppProfileName())
  ’将缺省值写入INI文件
  s=DefString
  End If
  GetIniS=s
End Function

Public Function GetIniN(ByVal SectionName As String,ByVal KeyWord As String,ByVal DefValue As Ineger)As Integer
  Dim d As Long,s As String
  d=DefValue
  GetIniN=GetPrivateProfileInt(SectionName,
  KeyWord,DefValue,ppProfileName())
  If d<>DefValue Then
   s=""
   d=WritePrivateProfileString(SectionName,
   KeyWord,s,AppProfileName())
  End If
End Function

Public Sub SetIniS(ByVal SectionName As String,BtVal KeyWord As String,ByVal ValStr As String)
  Dim res%
  res%=WritePrivateprofileString(SectionName,KeyWord,ValStr,AppProfileName())
End Sub
Public Sub SetIniN(ByVal SectionName As String,ByVal KeyWord As String,ByVal ValInt As Integer)
  Dim res%,s$
  s$=Str$(ValInt)
  res%=WriteprivateProfileString(SectionName,KeyWord,s$,AppProfileName())
End Sub

SectionName为每一部分的标题,KeyWord为关键词,GetIniS和GetIniN中的DefValue为关键词的缺省值,SetIniS和SetIniN的ValStr和ValInt为要写入INI文件的关键词的值。为了能更好地说明如何使用以上函数和过程,下面举两个实例。

实例1:

  开发应用程序通常要使用数据库和其它一些文件,这些文件的目录(包括路径和文件名)不应在程序中固定,而是保存在INI文件中,程序运行时由INI文件中读入。读入数据库文件的代码如下:

Dim Databasename As String
Databasename=GetIniS(“数据库”,“职工”,"")
If DatabaseName="" Then DatabaseName=InputBox(“请输入数据库《职工》的目录”),App.Title)
’也可通过“文件对话框”进行选择
On Error Resume Next
Set db=OpenDatabas(DatabaseName)
If Err<>0 Then
 MsgBox“打开数据库失败!”,MB-ICONSTOP,App.Title:GotoErrorProcessing
Else
 Set IniS“数据库”,“职工”,DatabaseName
End If
On Error GoTo 0
……

实例2:

  为了方便用户操作,有时需要保存用户界面的某些信息,例如窗口的高度和宽度等。装载窗体时,从INI文件中读入窗体高度和宽度,卸载窗体时将窗体当前高度和宽度存入INI文件,代码如下:

Private Sub Form1_Load()
 ……
 Forml.Height=GetIniN(“窗体1”,“高度”,6000)
 Form1.Width=GetIniN(“窗体1”,“高度”,4500)
EndSub
   ……
Private Sub Form1_Unload()
 ……
 SetIniN“窗体1”,“高度”,Me.Height
 SetIniN“窗体1,”宽度“,Me.Width
 ……
End Sub

royantal 2002-09-02
  • 打赏
  • 举报
回复
我把你写的全部考到程序里,可还是不行,显示空
xiaoxinghappy 2002-09-02
  • 打赏
  • 举报
回复
x=space$(255)
str=GetPrivateProfileString("localconn", "lDBServerName", "",x, 255, App.Path & "\app.ini")
x = Left(x, InStr(x, Chr(0)) - 1)

X 才是得到的值,而且要事先初始化。
royantal 2002-09-02
  • 打赏
  • 举报
回复
用msgbox x后什么都不显示,是不是这个函数用错了?
royantal 2002-09-02
  • 打赏
  • 举报
回复
我想要返回njdept这个字符串怎么做?
llpei 2002-09-02
  • 打赏
  • 举报
回复
声明中不是说得很清楚了吗

返回值为long 型
Long,复制到x缓冲区的字节数量,其中不包括那些NULL中止字符。如x缓冲区不够大,不能容下全部信息,就返回nSize-1
你应该用
msgbox x
llpei 2002-09-02
  • 打赏
  • 举报
回复
声明中不是说得很清楚了吗

返回值为long 型
Long,复制到x缓冲区的字节数量,其中不包括那些NULL中止字符。如x缓冲区不够大,不能容下全部信息,就返回nSize-1
你应该用
msgbox x
本资源为非常不错的一套王网传资源,是继之前上传的基础班的升级版,更加全面,资源过大,上传乃是下载链接,如失效请留言!!!资源远大于5积分,不多说,下面直接上目录: APC机制 I5 J$ i: U0 f1 r: O9 B( Q" b │ 01 APC的本质.mp4 │ 02 备用Apc队列.mp4: U8 p7 ]3 f" w$ b0 ?5 Z9 `0 H8 G* [ │ 03 APC挂入过程.mp48 g! H4 s1 V; ]+ b4 Y9 H0 L- B │ 04 内核APC执行过程.mp4 │ 05 用户APC执行过程.mp4 │ ├─事件等待' x% `" J' } ?& S: t' ]# I5 \5 G │ 01临界区.mp4- o( U$ W9 O+ ` ~0 u4 ~, @. \ │ 02 自旋锁.mp4) c3 ~. J& L, V& s. Q8 x/ [. w │ 03 线程等待与唤醒.mp4# b* ^" k$ d# O3 f8 t8 a3 k │ 04 WaitForSingleObject函数分析.mp4$ V7 L' C3 I( W │ 05 事件.mp4 │ 06 信号量.mp4 │ 07 互斥体.mp4 │ ├─保护模式- }! n! C$ O/ s" Q │ 014 中断门.mp4, B' i, r7 Y: B3 |! N( ^6 { l9 F │ 015 陷阱门.mp4 │ 017 任务段_下.mp4, |/ M# A: K3 T7 i* Q/ ? I& o& D; p │ 018 任务门.mp46 m. D+ f4 _/ V) ~9 S& B │ 019 10-10-12分页.mp4 │ 020 PDE_PTE.mp4 │ 021 PDE_PTE属性(P_RW).mp43 ~/ ]1 x5 {4 u: {$ I │ 022 PDE_PTE属性(US_PS_A_D).mp4 │ 023 页目录表基址.mp4 │ 024 页表基址.mp4$ A f' [+ g6 }5 F; e │ 025 2-9-9-12分页.mp4 │ 026 2-9-9-12分页(下).mp4- ~' ~9 i0 T5 f" p2 U$ j │ 027 TLB.mp4 │ 028 中断与异常.mp4 │ 029 控制寄存器.mp46 j2 l3 j) O# {% {4 w │ 030 PWT_PCD属性.mp4 │ 031 保护模式阶段测试.mp4 │ _001 保护模式.mp4, I; c5 X ~) t1 d1 }8 S# f3 i: b │ _002 段寄存器结构.mp48 n- |- i( H$ ^* f │ _003 段寄存器属性探测.mp4 │ _004 段描述符与段选择子.mp4 │ _005 段描述符属性_P位_G位.mp4 │ _006 段描述符属性_S位_TYPE域.mp4 │ _007 段描述符属性_DB位.mp4 │ _008 段权限检查.mp4 │ _009 代码跨段跳转流程.mp4& S# i9 i- \0 D" @1 U- P │ _010 代码跨段跳转实验.mp4" @* S2 Y- a- S6 n7 n: ~ │ _011 长调用与短调用.mp4 │ _012 调用门_上.mp4; [) _2 c8 A5 F% }! u% ]: ~. N │ _013 调用门_下.mp4 │ ├─内存管理 │ 01 线性地址的管理.mp4; ? |+ ^5 i& } │ 02 Private Memory.mp4* @3 B( Y6 ^ y- { │ 03 Mapped Memory.mp4 │ 04 物理内存的管理.mp4' [8 C6 q \1 H8 w" H2 ]0 Y │ 05 无处不在的缺页异常.mp4 │ ├─句柄表 │ 01 句柄表.mp4 │ 02 全局句柄表.mp4 │ 5 h" u" i& {+ G4 T+ E ├─异常 │ 01 CPU异常记录.mp4 │ 02 模拟异常记录.mp4: K0 J( d1 n4 ] Q │ 03 内核异常的处理流程.mp4 │ 04 用户异常的分发.mp4 │ 05 VEH.mp4 C F6 A% j# M* @- h% N │ 06 SEH.mp4 │ 07 编译器扩展SEH课堂代码_1.mp42 I" @1 i1 b% G6 o4 O% j: t │ 08 编译器扩展SEH_2.mp4 │ 09 编译器扩展SEH_3.mp4 │ 10 编译器扩展SEH_4.mp4 │ 11 未处理异常.mp4. m' z+ `$ v- R/ K. `/ \2 M, S │ ├─消息机制0 y7 o3 ?7 X7 Z, F" I( Q │ 01 消息队列在哪.mp4$ {& n5 ]* g' H, W# k6 |+ M │ 02 窗口与线程.mp4 │ 03 消息的接收.mp4- a8 k- Q8 {! I* T8 L7 j │ 04 消息的分发.mp4- M* `$ q% z, y, R │ 05 内核回调机制.mp4 │ 0 ]( v: v$ e% _/ v, e ├─系统调用: |5 y7 Y% q' w, J │ 001 API函数的调用过程(3环部分).mp4; }0 Z8 P$ g# I6 \! _ y │ 002 API函数的调用过程(3环进0环 上).mp4- g. o" u+ M1 Y) x │ 003 API函数的调用过程(3环进0环 下).mp46 p* w2 @* j9 ?% Z3 e$ \: ? │ 004 API函数的调用过程(保存现场).mp44 G8 |/ j3 ^8 ?1 D9 Y │ 005 API函数的调用过程(系统服务表).mp4 │ 006 API函数的调用过程(SSDT).mp4 │ ! A- ~, L8 M. l ├─软件调试% a8 o, z* m) E$ M( \" P D! m7 x4 B │ 01 调试对象.mp4 c- K+ k3 F( v3 p2 R9 E$ n$ f: Z6 k) @ │ 02 调试事件的采集.mp4 │ 03 调试事件的处理.mp4( w" W. m) o: D3 P7 ? │ 04 异常的处理流程.mp4 │ 05 软件断点.mp4 │ 06 内存断点.mp4 │ 07 硬件断点.mp4 │ 08 单步异常.mp4% P5 e* U+ M# a1 j3 D6 n; n │ 09 单步步过.mp4 │ 10 硬件HOOK过检测.mp46 H5 q2 K& X1 u$ ]/ E │ ├─进程与线程 │ 001 进程结构体.mp4 │ 002 线程结构体.mp41 `5 e+ [1 U) j │ 003 KPCR.mp4 │ 004 等待链表_调度链表.mp41 m! T& `3 t' U& U# A- @+ _ │ 005 模拟线程切换.mp4& ?, D% H/ z- d# _& \$ X- X$ U │ 006 Windows线程切换_主动切换.mp4 │ 007 Windows线程切换_时钟中断切换.mp4/ s& N% Y5 B" @2 g │ 008 Windows线程切换_时间片管理.mp48 X( v. g" T0 ~- k! v* Q │ 009 Windows线程切换_TSS.mp4 n+ A9 L5 B2 t* M# H │ 010 Windows线程切换_FS.mp4 │ 011 Windows线程切换_线程优先级.mp4 A! a% n1 c. Y5 y# ~ L4 P │ 012 进程挂靠.mp4 │ 013 跨进程读写内存.mp4, E0 ^0 U I1 h │ $ {. ?; O) C* w1 K. q) K └─驱动开发 01 驱动开发环境配置.mp4* W) g2 z& T/ _; @1 V" n 02 第一个驱动程序.mp4 03 如何调试驱动程序.mp4; [8 U2 T) B' V 04 内核编程基础.mp4 05 内核空间与内核模块.mp4 06 0环与3环通信(常规方式).mp46 O: Z; `3 `( L 07 SSTD HOOK.mp46 D t( {, u1 D/ x) h! ]: g 08 Inline Hook.mp4 09 多核同步之临界区.mp40 l& ^, e3 J( E1 d( b2 S 10 多核同步之自旋锁.mp4 11 重载内核

1,485

社区成员

发帖
与我相关
我的任务
社区描述
VB API
社区管理员
  • API
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧