- Код: Выделить всё
Open "j:\1.txt:" + Chr(5) + "SummaryInformation" For Binary Access Read As #1
Dim stroka As String
stroka = String(1000, Chr(1))
Get #1, , stroka
stroka = Replace(stroka, vbNullChar, Chr(1))
MsgBox stroka
Close #1
Open "j:\1.txt:" + Chr(5) + "DocumentSummaryInformation" For Input As #1
Line Input #1, stroka
MsgBox stroka
Close #1
это на vb6
кстати говоря, ещё одна жопа дотнета - он проверяет строку с именем файла перед тем как её использовать и ругается File format not supported - кароче надо использовать апихи.
а вообще вот так собсна я узнал названия потоков:
- Код: Выделить всё
// StreamWork.cpp : Defines the entry point for the console application.
//
#include "stdafx.h"
#include <windows.h>
#include <stdio.h>
LPWSTR GetWide(LPSTR multi);
void ErrMsg(int err);
//LPWSTR some_func();
int _tmain(int argc, _TCHAR* argv[])
{
//some_func();
//GetWide("!@");
//ErrMsg(1);
//MessageBox(NULL,GetWide("Вива!"),_TEXT("Caption"),0);
//int err;
WIN32_STREAM_ID sic;
HANDLE f=NULL;
f = CreateFile((LPCWSTR)_TEXT("j:\\1.txt"),GENERIC_READ,0,0, //
OPEN_EXISTING,FILE_FLAG_BACKUP_SEMANTICS ,0);//FILE_ATTRIBUTE_NORMAL|| FILE_FLAG_POSIX_SEMANTICS
if (f)
{
OVERLAPPED lapa;
BOOL rez;
DWORD readed=0;
HLOCAL buf;
memset(&lapa,0,sizeof(lapa));
memset(&sic,0,sizeof(sic));
buf=LocalAlloc(0,1000);
int foo=1;
DWORD s=0;
HLOCAL cntxt=LocalAlloc(0,1000);
memset(cntxt,0,1000);
rez=BackupRead(f,(LPBYTE)&sic,20,&readed,0,0,(LPVOID*)cntxt);
if (sic.dwStreamNameSize>0)
{
LPWSTR name=(LPWSTR)LocalAlloc(0,sic.dwStreamNameSize+2);
memset(name,0,sic.dwStreamNameSize+2);
rez=BackupRead(f,(LPBYTE)name,sic.dwStreamNameSize,&readed,0,0,(LPVOID*)cntxt);
MessageBox(NULL,(LPWSTR)name,_TEXT("Caption"),0);
LocalFree(name);
}
//memcpy(name,&sic.cStreamName[0],sic.dwStreamNameSize);
if (rez==0) ErrMsg(GetLastError());
//s+=sizeof(sic);
s=(DWORD)sic.Size.LowPart;
rez=BackupSeek(f,s,0,&readed,&readed,(LPVOID*)cntxt);
rez=ReadFile(f,buf,1000,&readed,&lapa);
if (rez==0) ErrMsg(GetLastError());
((LPSTR)buf)[readed]=0;
MessageBox(NULL,GetWide((LPSTR)buf),_TEXT("Caption"),0);
}else{
ErrMsg(GetLastError());
}
//err=GetLastError();
//int some =MAKELANGID(LANG_RUSSIAN, SUBLANG_RUSSIAN_US);
//int some = MAKELANGID(LANG_RUSSIAN, SUBLANG_ENGLISH_US);
return 0;
}
LPWSTR GetWide(LPSTR multi)
{
//int wlen=0;
LPWSTR buf=NULL;
int rez=MultiByteToWideChar(CP_ACP,0,multi,-1,buf,0);
buf=(LPWSTR)LocalAlloc(0,rez*sizeof(WCHAR));
rez=MultiByteToWideChar(CP_ACP,0,multi,-1,buf,rez);
//ErrMsg(GetLastError());
return buf;
}
LPWSTR some_func()
{
return (LPWSTR)0;
}
void ErrMsg(int err)
{
HLOCAL hlocal = NULL; // буфер для строки с описанием ошибки
// получаем текстовое описание ошибки
BOOL fOk = FormatMessage(FORMAT_MESSAGE_FROM_SYSTEM | FORMAT_MESSAGE_ALLOCATE_BUFFER,NULL,
err, MAKELANGID(LANG_RUSSIAN, SUBLANG_ENGLISH_US), //MAKELANGID(LANG_ENGLISH, SUBLANG_ENGLISH_US)
(LPTSTR) &hlocal, 0, NULL);
MessageBox(NULL,(LPCWSTR)hlocal,(LPCWSTR)_TEXT("Caption"),0);
}
это на неуправляемой сишке (всё сыро до беспредела - гулять тока под дебагом - цикл тож ручками, ленивый я), но можно тему развить и написать класс на дотнете для работы с потоками, в том числе и со сводкой. Буду очень благодарен, если ты его тут выложишь...