APIって
■ このスレッドは過去ログ倉庫に格納されています
0001名無し~3.EXE
NGNG0002名無し~3.EXE
NGNGP
I
0003名無し~3.EXE
NGNGI
0004名無し~3.EXE
NGNG∧ ∧___
/(*゚ー゚) /\
/| ̄∪∪ ̄|\/
| |/
0005名無し~3.EXE
NGNGP I
0006名無し~3.EXE
NGNGぽこちん
逝ってよし
0007名無し~3.EXE
NGNG主に、Windows の機能を呼び出す事ですね。
基本的に、ほぼ API を呼び出さないと、現状ではプログラミングが
出来ないほど普及しています。
0009名無し~3.EXE
NGNGPrivate Declare Function UnlhaOpenArchive Lib "UnLHA32.DLL" _
(ByVal hwnd As Long, _
ByVal szFilename As String, _
ByVal dwMode As Long) As Long
Private Declare Function UnlhaCloseArchive Lib "UnLHA32.DLL" _
(ByVal harc As Long) As Long
Private Declare Function UnlhaFindFirst Lib "UnLHA32.DLL" _
(ByVal harc As Long, _
ByVal szWildName As String, _
lpSubInfo As tagINDIVIDUALINFO) As Long
Private Declare Function UnlhaFindNext Lib "UnLHA32.DLL" _
(ByVal harc As Long, _
lpSubInfo As tagINDIVIDUALINFO) As Long
0010名無し~3.EXE
NGNGdwOriginalSize As Long ' /* ファイルのサイズ */
dwCompressedSize As Long ' /* 圧縮後のサイズ */
dwCRC As Long ' /* 格納ファイルのチェックサム */
uFlag As Long ' /* 処理結果 */
uOSType As Long ' /* 書庫作成に使われたOS */
wRatio As Integer ' /* 圧縮率 */
wDate As Integer ' /* 格納ファイルの日付(DOS 形式) */
wTime As Integer ' /* 格納ファイルの時刻(〃) */
szFilename As String * FNAME_MAX32PLUS1 ' /* 書庫名 */
dummy1 As String * 3
szAttribute As String * 8 ' /* 格納ファイルの属性 書庫固有 */
szMode As String * 8 ' /* 格納ファイルの格納モード 〃 */
End Type
0011名無し~3.EXE
NGNGDim udtINDIVIDUALINFO As tagINDIVIDUALINFO
Dim strFileName As String ' 書庫ファイル名
Dim lngArcHandle As Long ' 書庫ファイルのハンドル
Dim lngResult As Long ' APIの戻り値用
' 書庫ファイル名を格納。
strFileName = "C:\My Documents\HEROPA\VBDeFM\vbdfm01f.lzh"
' 書庫ファイルとハンドルを関連付ける。
lngArcHandle = UnlhaOpenArchive(Me.hwnd, strFileName, 0)
If lngArcHandle <> 0 Then
' 最初の書庫内のファイルの情報を取り出す。
If UnlhaFindFirst(lngArcHandle, "*.*", udtINDIVIDUALINFO) = 0 Then
Do
' (udtINDIVIDUALINFOを処理するルーチンをここに書く)
' 次の格納ファイルの情報を取り出す。
Loop While UnlhaFindNext(lngArcHandle, udtINDIVIDUALINFO) = 0
End If
' 書庫ファイルハンドルを閉じる。
lngResult = UnlhaCloseArchive(lngArcHandle)
End If
0012名無し~3.EXE
NGNGしかし、Windows APIには、DOS形式の日付と時間をFILETIME形式に変換するDosDateTimeToFileTimeがあります。FILETIME形式にすれば、今度はFileTimeToSystemTimeに変更すれば、個々の時間の値は簡単に取り出せます。
もう少し欲を出して、FILETIME形式から直接Visual Basicの日付型に変更する方法を考えてみます。
FILETIMEはPlatform SDKによれば、64ビットのLARGE_INTEGERで1601/01/01からの100ナノ秒で表された値とあります。一方、Visual Basicの日付型は1899/12/30が0で表される浮動小数点の変数とあります。
とすれば、1601年から1899年までの日数を引けばVisual Basicの日付型に変更できます。APIの宣言では同じ64ビットの変数であるCurrency(通貨型)で受け、その値を処理することにします。
通貨型は15 桁の整数部分と 4 桁の小数部分を持つ固定小数点数なので、LARGE_INTEGERを通貨型で受けると、1/10000の値になってしまうが、値自体は10000倍すれば問題なく使えそうです。
つまり、1日のミリ秒数で割り、1601年以降の日数を取得すれば、それは日付型になります。
1日のミリ秒は、10,000,000ナノ秒×60秒×60分×24時間÷10,000となる。
よって、Visual Basicでの変換は、
dteArcFileDate = CDate((udtFILETIME / 10000000# * 60# * 60# * 24# / 10000#) - CDbl(#1899-12-30# - #1601-01-01#))
実際に使う場合は、演算結果を定数にしておけば、若干動作は速くなるだろうから、
Const conDayZeroBios As Double = 109205#
Const conMillisecondPerDay As Double = 10000000# * 60# * 60# * 24# / 10000#
dteArcFileDate = CDate((udtFILETIME / conMillisecondPerDay) - conDayZeroBios)
とすることにします。
0014名無し~3.EXE
NGNGVC は基本的に関数の塊なので・・・・
プログラム板にいった方がいいよ〜ん
http://piza.2ch.net/test/read.cgi?bbs=tech&key=973187725
WinAPI 相談室
■ このスレッドは過去ログ倉庫に格納されています