Отправляет email-рассылки с помощью сервиса Sendsay

Программирование. Форум !!!

Re: Новости дискуссионного листа "Программирование. Форум !!!"

Original Message From: "Serik" <ser***@g*****.net>
To: "comp.soft.prog.prog (3604359)" <hdd***@m*****.ru>
Sent: Monday, November 03, 2003 9:00 AM

hdd***@M*****.ru

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: http://subscribe.ru/member/unsub?grp=comp.soft.prog.prog&email=
http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   Mon, 3 Nov 2003 08:59:31 +0300 (#15591)

 

Ответы:

Здравствуйте, уважаемые подписчики дискуссионного листа
"Программирование. Форум !!!".

Вот и появились первые участники голосования. Здорово !
Присоединяюсь и сам.

в. (как бы я к этому не относился, но это так...).

а. - почти всегда,
б. - немного (преимущественно делфи).
в. - только в виде маленьких вставочек в а. :-)
г. - и еще немного VB, Perl, JScript

В основном MS Visual C++ 6.0.

а. - почти всегда.
б. - очень немного (иногда все-таки приходится писать и под линух).

Приглашаю присоединиться всех, кто еще не успел сделать этого.

Виктор.

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: http://subscribe.ru/member/unsub?grp=comp.soft.prog.prog&email=
http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   Mon, 3 Nov 2003 21:46:59 +0300 (#15969)

 

"Программирование. Форум !!!".

Подписался на форум два дня назад.
Сразу пришла эта анкета.
Но перд тем как ответить на нее хотел бы узнать смогу ли я при помощи
данного форума выяснить вопрсы возникающие у меня при прогамировании на С++?

б. Хотя лет 6-7 назад я ответил бы в.В настоящее время sysadmin

а. - Два месяца осваиваю практически самостоятельно (есть вопросы)
б. - Программировал в период указанный в первом ответе.
в. - освоил практически полностью (особенно интересовался работой
процессора в защищенном режиме)

MS Visual C++ 6.0.
TASM,MS Visual Basic 6.0

а. - всегда.

Владимир.

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: http://subscribe.ru/member/unsub?grp=comp.soft.prog.prog&email=
http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   "vlad" Tue, 4 Nov 2003 20:09:12 +0500 (#16388)

 

Собственно, для этого и создан этот форум :-) Для обмена опытом.
Так что - спрашивайте, не стесняйтесь.
Вопросы только приветствуются.

Vic.

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: http://subscribe.ru/member/unsub?grp=comp.soft.prog.prog&email=
http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   Tue, 4 Nov 2003 21:10:55 +0300 (#16534)

 

Итак вопросы начинающего на С++
В одном из примеров встретил функцию
HANDLE hDIB=DDBToDIB( bitmap, BI_RGB, &pal );
при трансляции функцию не опознал компилятор поиск по всем файлам *.h
эту функцию не обнваружил.В чем здесь проблема?
И дополнительный вопрос MSDN у меня
она отсутствует. Как ее устанвить?

Владимир

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: http://subscribe.ru/member/unsub?grp=comp.soft.prog.prog&email=
http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   "vlad" Wed, 5 Nov 2003 20:25:37 +0500 (#16999)

 

Здравствуйте !

Стандартной библиотечной или API - функции DDBToDIB нет, поэтому
то вы ее в хидерах (h - файлах) и не нашли. Очевидно, эта функция
должна быть продекларирована и реализована в самом примере.
Быть может, в Вашем примере каких нибудь файлов не хватает ?

Если можно, поподробней - что за пример (не из MSDN) ?

Vic.

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: http://subscribe.ru/member/unsub?grp=comp.soft.prog.prog&email=
http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   Wed, 5 Nov 2003 23:11:32 +0300 (#17157)

 

Пример взят из Интернета с сайта http:\\www.sources.ru страннчку отправляю
вместе с письмом

-----Original MessageFrom: Victor V. Vakchturov [mailto:forum-moderat***@m*****.ru]
Sent: Thursday, November 06, 2003 1:12 AM
To: comp.soft.prog.prog (1840500)

Здравствуйте !

Стандартной библиотечной или API - функции DDBToDIB нет, поэтому
то вы ее в хидерах (h - файлах) и не нашли. Очевидно, эта функция
должна быть продекларирована и реализована в самом примере.
Быть может, в Вашем примере каких нибудь файлов не хватает ?

Если можно, поподробней - что за пример (не из MSDN) ?

Vic.

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: http://subscribe.ru/member/unsub?grp=comp.soft.prog.prog&email=
http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   "vlad" Thu, 6 Nov 2003 22:06:32 +0500 (#17571)

 

Здравствуйте !

К сожалению, приаттаченные документы и HTML в письме
в рассылку не проходят - сервис Subscribe отрезает все
по самые помидоры. Поэтому лучше пришлите ссылочку
на страницу на sources.ru, где лежит код.
Так вернее будет.

Vic.

P.S. Кстати, судя по прототипу функции и ее названию назначение
весьма очевидно. Можно даже попробовать ее самому набросать.

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: http://subscribe.ru/member/unsub?grp=comp.soft.prog.prog&email=
http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   Thu, 6 Nov 2003 22:17:43 +0300 (#17614)

 

Понял
отправляю полную ссылку
http://www.sources.ru/cpp/bitmap/window_to_file.shtml

Владимир

-----Original MessageFrom: Victor V. Vakchturov [mailto:forum-moderat***@m*****.ru]
Sent: Friday, November 07, 2003 12:18 AM
To: comp.soft.prog.prog (1840500)

Здравствуйте !

К сожалению, приаттаченные документы и HTML в письме
в рассылку не проходят - сервис Subscribe отрезает все
по самые помидоры. Поэтому лучше пришлите ссылочку
на страницу на sources.ru, где лежит код.
Так вернее будет.

Vic.

P.S. Кстати, судя по прототипу функции и ее названию назначение
весьма очевидно. Можно даже попробовать ее самому набросать.

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: http://subscribe.ru/member/unsub?grp=comp.soft.prog.prog&email=
http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   "vlad" Fri, 7 Nov 2003 11:51:32 +0500 (#17687)

 

Ясненько. Бегло взглянул - сперли они откуда то все это...
Как то странно - есть статейка, но из кода - всего одна функция.

Не ручаюсь, что все будет работать абсолютно корректно,
но у меня работает. Вот попытался воссоздать недостающее
(когда то писал подобное) :

HANDLE DDBToDIB(CBitmap &bitmap, DWORD dwCompression, CPalette* pPal)
{
HDC hDC;
BITMAP bm;
DWORD dwLen;
HANDLE hDIB;
HANDLE handle;
BITMAPINFOHEADER bi;
LPBITMAPINFOHEADER lpbi;

if(bitmap.GetSafeHandle() == NULL)
return NULL;

if(dwCompression == BI_BITFIELDS)
{
// для BI_BITFIELDS поддержки нет.
// уу, правда, можно легко добавить.

TRACE("BI_BITFIELDS not supported :-(\n");

return NULL;
}

HPALETTE hPalette = (HPALETTE) pPal->GetSafeHandle();

if(hPalette == NULL)
hPalette = (HPALETTE) ::GetStockObject(DEFAULT_PALETTE);

bitmap.GetObject(sizeof(bm), (LPSTR) &bm);

bi.biSize = sizeof(BITMAPINFOHEADER);
bi.biWidth = bm.bmWidth;
bi.biHeight = bm.bmHeight;
bi.biPlanes = 1;
bi.biBitCount = (unsigned short) (bm.bmPlanes * bm.bmBitsPixel) ;
bi.biCompression = dwCompression;
bi.biSizeImage = 0;
bi.biXPelsPerMeter = 0;
bi.biYPelsPerMeter = 0;
bi.biClrUsed = 0;
bi.biClrImportant = 0;

int nColors = 0;

if(bi.biBitCount <= 8)
nColors = (1 << bi.biBitCount);

dwLen = bi.biSize + nColors * sizeof(RGBQUAD);

hDC = ::GetDC(NULL);
hPalette = SelectPalette(hDC, hPalette, FALSE);
RealizePalette(hDC);

hDIB = GlobalAlloc(GMEM_FIXED, dwLen);

if(!hDIB)
{
SelectPalette(hDC, hPalette, FALSE);
::ReleaseDC(NULL, hDC);
return NULL;
}

lpbi = (LPBITMAPINFOHEADER) GlobalLock(hDIB);

*lpbi = bi;

GetDIBits(hDC, (HBITMAP) bitmap.GetSafeHandle(), 0L, (DWORD) bi.biHeight,
(LPBYTE) NULL, (LPBITMAPINFO) lpbi, (DWORD) DIB_RGB_COLORS);

bi = *lpbi;

if (bi.biSizeImage == 0)
{
bi.biSizeImage = ((((bi.biWidth * bi.biBitCount) + 31) & ~31) / 8)
* bi.biHeight;

if (dwCompression != BI_RGB)
bi.biSizeImage = (bi.biSizeImage * 3) / 2;
}

dwLen += bi.biSizeImage;

handle = GlobalReAlloc(hDIB, dwLen, GMEM_MOVEABLE) ;

if (handle != NULL)
hDIB = handle;
else
{
GlobalFree(hDIB);

SelectPalette(hDC, hPalette, FALSE);

::ReleaseDC(NULL,hDC);

return NULL;
}

lpbi = (LPBITMAPINFOHEADER)hDIB;

BOOL bSuccess = GetDIBits(hDC, (HBITMAP) bitmap.GetSafeHandle(),
0L,
(DWORD) bi.biHeight,
(LPBYTE)lpbi + (bi.biSize + nColors * sizeof(RGBQUAD)),
(LPBITMAPINFO) lpbi,
(DWORD) DIB_RGB_COLORS);

if(!bSuccess)
{
GlobalFree(hDIB);

SelectPalette(hDC, hPalette, FALSE);

::ReleaseDC(NULL,hDC);

return NULL;
}

SelectPalette(hDC, hPalette, FALSE);

::ReleaseDC(NULL,hDC);

return hDIB;
}

WriteDIB(LPCTSTR lpszFileName, HANDLE hDib)
{
if(!hDib)
return FALSE ;

CFile file;

if(!file.Open(lpszFileName, CFile::modeWrite | CFile::modeCreate))
return FALSE ;

LPBITMAPINFOHEADER lpBmpheader = (LPBITMAPINFOHEADER)hDib ;

int ncolors = 1 << lpBmpheader->biBitCount ;

BITMAPFILEHEADER fileheader;

fileheader.bfType = ((WORD) ('M' << 8) | 'B');
fileheader.bfSize = GlobalSize (hDib) + sizeof(fileheader);
fileheader.bfReserved1 = 0 ;
fileheader.bfReserved2 = 0 ;
fileheader.bfOffBits = (DWORD) (sizeof(fileheader) + lpBmpheader->biSize +
ncolors * sizeof(RGBQUAD)) ;

file.Write(&fileheader, sizeof(fileheader)) ;

file.Write(lpBmpheader, GlobalSize(hDib)) ;

return TRUE ;
}

Функция DDBToDIB не пропускает dwCompression = BI_BITFIELDS - там надо еще
под 3 RGBQUAD выделять память, кажется и еще что то.

В принципе, полезные весьма функции.

Vic.

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: http://subscribe.ru/member/unsub?grp=comp.soft.prog.prog&email=
http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   Sat, 8 Nov 2003 08:13:44 +0300 (#18007)

 

Спасибо Vic.
Как то не сработала мысль,что и тут могут надуть.
Всетаки проясни мне пожалуста ситуацию с MSDN. На моем ПВЭМе она не стоит.На
сколько я понял необходимо приобрести компакт диски для ее установки?
Владимир

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: http://subscribe.ru/member/unsub?grp=comp.soft.prog.prog&email=
http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   "vlad" Sat, 8 Nov 2003 20:14:17 +0500 (#18112)

 

Здравствуйте !

Ну да. Собственно, MSDN входит в комплект поставки пакета Microsoft Visual
Studio.
Там компактов много. Обычно 6 - я студия была на 6-и компактах.
Сам MSDN - на 3-х, еще на одном - Visual C++, Visual Basic, Visual FoxPro,
Source Safe, а также средства моделирования (Visual Modeler), реинжиринга
(Visual Analyzer),
утилиты всякие, и.т.д. В принципе, для того, чтобы поставить MSDN достаточно
2-х
компактов. На первом копакте основные файлы справки, индекс и каталог с
примерами, на
втором - все остальные справочные файлы. Но третий компакт тоже иногда
требуется - там лежат
статьи, подборка публикаций переодических изданий. Так что если нужен именно
MSDN, то будет
достаточно 3-х компактов. Основные средства разработки Visual Studio лежат
еще на одном.
На остальных 2 - дополнительные утилиты и еще что то (я их не ставил
никогда).

Сейчас все большее распространение получает Visual Studio NET - в этом
пакете свой MSDN.
Суть одна и та же, но MSDN из NET запускается в своей оболочке (MSDN из
Visual Studio 6.0
открывался виндовой программой справки (hh.exe)). Так что, в принципе можно
и NET - овский
MSDN юзать. Можно даже параллельно поставить две студии (6 - ю и NET).

Vic.

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: http://subscribe.ru/member/unsub?grp=comp.soft.prog.prog&email=
http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   Sat, 8 Nov 2003 22:47:56 +0300 (#18198)

 

Теперь все понятно.
Собственно там где я брал Visual Studio мне продали комплект из двух
комактов. То ли для удишевления то ли еще по каким причинам. Сразуже после
раскрутки и возникла ситуация с отсутствием MSDN. Теперь все понятно.

Теперь хочу задать тебе вопрос по синтаксису
в файле заголовка объявлен ноый класс
class CInternetSessionEx : public CInternetSession
{
CInternetSessionEx(LPCTSTR pstrAgent = NULL,
DWORD dwContext = 1,
DWORD dwAccessType = PRE_CONFIG_INTERNET_ACCESS,
LPCTSTR pstrProxyName = NULL,
LPCTSTR pstrProxyBypass = NULL,
DWORD dwFlags = 0);
}

и расписан конструктор есть там еще несколько процедур я их не привожу

В файле реализаиий следующая конструкция
CInternetSessionEx::CInternetSessionEx(LPCTSTR pstrAgent /*= NULL*/,
DWORD dwContext /*= 1*/,
DWORD dwAccessType /*= PRE_CONFIG_INTERNET_ACCESS*/,
LPCTSTR pstrProxyName /*= NULL*/,
LPCTSTR pstrProxyBypass /*= NULL*/,
DWORD dwFlags /*= 0*/)
: CInternetSession (pstrAgent, dwContext, dwAccessType, pstrProxyName,
pstrProxyBypass, dwFlags)
{
hWnd = 0;
}
Если я правильно понял через двое точие происходит вызов конструктора
базового класса?

Владимир

-----Original MessageFrom: Victor V. Vakchturov [mailto:forum-moderat***@m*****.ru]
Sent: Sunday, November 09, 2003 12:48 AM
To: comp.soft.prog.prog (1840500)

Здравствуйте !

Ну да. Собственно, MSDN входит в комплект поставки пакета Microsoft Visual
Studio.
Там компактов много. Обычно 6 - я студия была на 6-и компактах.
Сам MSDN - на 3-х, еще на одном - Visual C++, Visual Basic, Visual FoxPro,
Source Safe, а также средства моделирования (Visual Modeler), реинжиринга
(Visual Analyzer),
утилиты всякие, и.т.д. В принципе, для того, чтобы поставить MSDN достаточно
2-х
компактов. На первом копакте основные файлы справки, индекс и каталог с
примерами, на
втором - все остальные справочные файлы. Но третий компакт тоже иногда
требуется - там лежат
статьи, подборка публикаций переодических изданий. Так что если нужен именно
MSDN, то будет
достаточно 3-х компактов. Основные средства разработки Visual Studio лежат
еще на одном.
На остальных 2 - дополнительные утилиты и еще что то (я их не ставил
никогда).

Сейчас все большее распространение получает Visual Studio NET - в этом
пакете свой MSDN.
Суть одна и та же, но MSDN из NET запускается в своей оболочке (MSDN из
Visual Studio 6.0
открывался виндовой программой справки (hh.exe)). Так что, в принципе можно
и NET - овский
MSDN юзать. Можно даже параллельно поставить две студии (6 - ю и NET).

Vic.

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: http://subscribe.ru/member/unsub?grp=comp.soft.prog.prog&email=
http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   "vlad" Sun, 9 Nov 2003 09:45:44 +0500 (#18254)

 

Здравствуйте !

Ну, да. Обычно для конструкторов с параметрами вызывают конструктор
базового класса.
При множественном наследовании вызывают конструкторы нескольких базовых
классов.

То есть :

class cl1
{
public :
cl1(int a)
{
value_a = a;
}

int value_a;
};

class cl2
{
public :
cl2(int b)
{
value_b = b;
}

int value_b;
};

class cl3 : public cl1, cl2
{
public :
cl3(int a, int b) : cl1(a), cl2(b)
{
}

void print_values()
{
printf( "value_a = %d\n"
"value_b = %d\n", value_a, value_b);
}
};

класс cl3 наследован от cl1 и cl2. Для инициализации переменных можно
написать конструктор,
вызывающий конструкторы базовых классов.

Если потом объявить объект класса и вызвать print_values :

cl3 val(1, 2);
val.print_values();

результат выведется :

value_a = 1
value_b = 2

Но вообще множественное наследование применять обычно не рекомендуется.

Во-первых, при достаточно сложной структуре классов программа становится
менее читабельной,
Во-вторых, в ряде случаев приходится переопределять оператор new для класса,
понаследованного
от более чем одного класса. С операторами присваивания тоже начинается
морока.
Я использовал множественное наследование только один раз в крупном проекте
и, честно говоря,
пожалел об этом.

Vic.

P.S. Народ, присоединяйтесь !

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: http://subscribe.ru/member/unsub?grp=comp.soft.prog.prog&email=
http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   Sun, 9 Nov 2003 21:54:13 +0300 (#18468)

 

Зрравствуй Vic
Спасибо за ответ.Т.е.заканчивая обсуждение предидущего вопроса я делаю
вывод, что вызов базового класса лучше всетаки делать из тела конструктора.
Теперь вопросы (у меня их много) буду задавать в порядке в котором они у
меня возникают.

И так создан проект на базе CDialog допустим имя FtpFirst;
В файле заголовка FtpFirstDlg.h обьявлен класс
class CFtpFirstDlg:public CDialog
{
.....
static UINT getDownloadFileFunc(LPVOID pParam);//Обьявлена такая функция
....
static CFtpConnection* pFtpConnect;
CInternetSessionEx* pSession;//и две таких переменных

....
void connect(void);
}

Теперь в файле cpp в функции connect инициализируется сессия а вней
инициализируется PFtpConnect
после того как коннект установлен нужный файл найден вызывается процедура
AfxBeginThread(getDownloadFileFunc,0);
если функция getDownloadFileFunc не static то транслятор выдает ошибку при
ав этом месте
CFtpFirstDlg::getDownloadFileFunc(LPVOID pParam)
{
.....
pFtpConnect-> //если тип переменной static то переменная разрешена
транслятор не выдает ошибки

}
но при линковке возникает ошибка
в чем здесь проблема?

Владимир

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: http://subscribe.ru/member/unsub?grp=comp.soft.prog.prog&email=
http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   "vlad" Tue, 11 Nov 2003 19:00:11 +0500 (#19263)

 

Здравствуйте !

Все достаточно просто. Функция getDownloadFileFunc действительно должна
быть статической. Дело в том, что в AfxBeginThread должен передаваться
указатель либо на глобальную функцию, либо на статическую функцию-член
класса.

Поясню.

Но сначала небольшое лирическое отступление...

Представьте, что вы пишете программу на чистом C (не C++).

У вас есть некоторые данные в виде структуры. Например :

struct MyStruct
{
int a1;
int a2;
};

Для оперирования с данными вы пишете несколько функций :

void init(MyStruct *pStruct)
{
pStruct->a1 = 0;
pStruct->a2 = 0;
}

void print(MyStruct *pStruct)
{
printf("a1 = %d a2 = %d", pStruct->a1, pStruct->a2);
}

и, наконец, используете эти функции :

MyStruct data;

init(&data);
print(&data);

Здорово, но надо передавать указатель.
Объектно-ориентированные языки программирования решают эту проблему,
передавая этот самый указатель на данные за вас неявным образом.
То есть на C++ можно все вышеизложенное написать так :

struct MyStruct
{
int a1;
int a2;

void init();
void print();
};

void MyStruct::init()
{
a1 = 0;
a2 = 0;
}

void MyStruct::print()
{
printf("a1 = %d a2 = %d", a1, a2);
}

а а потом использовать :

MyStruct data;

data.init();
data.print();

Для компилятора и первый и второй пример практически одинаков.
В обоих случаях в функции init и print первым параметром передается
указатель на структуру данных, только во втором случае - неявно.

Но его можно использовать (например так) :

void MyStruct::init()
{
this->a1 = 0;
a2 = 0;
}

Как вы заметили, в C++ структура также может инкапсулировать
методы как класс. Но чем же тогда класс отличается от структуры
в терминах C++ ?

Можно делать так :

MyStruct data;
data.a1 = 0;

То есть в структуре все переменные по-умолчанию - public;

И вот если объявить не структуру, а класс :

class MyStruct
{
int a1;
int a2;

void init();
void print();
};

И потом объявить объект этого класса и попытаться поюзать методы и
свойства :

MyStruct data;
data.a1 = 0;
data.print();

компилятор ругнется, что a1 и print protected. То есть в классах
методы и свойства по-умолчанию - protected. И еще - сцитается, что
класс принципиально отличается от структуры только одним -
наличием конструктора. Хотя в VC++ пробовал - у структуры тоже
можно написать конструктор.

А теперь - о наших баранах...

Функция (AFX_THREADPROC pfnThreadProc, ... принимает первым
параметром указатель на функцию, тип которого AFX_THREADPROC.

AFX_THREADPROC продекларирован так :

typedef UINT (AFX_CDECL *AFX_THREADPROC)(LPVOID);

То есть этой функции передается только один параметр.

А учтя все вышесказанное,
если в классе декларируется функция :

class CFtpFirstDlg:public CDialog
{
UINT getDownloadFileFunc(LPVOID pParam);
...

Компилятор компилирует код для передачи двух параметров - this и pParam.
И с точки зрения компилятора, прототипы этих функций абсолютно разные.

Поэтому традиционным подходом при решении таких задач является передача
указателя на объект класса в качестве параметра pParam.

То есть в вашем случае чтобы в функции рабочего потока можно было
использовать методы и свойства класса CFtpFirstDlg, функцию
UINT getDownloadFileFunc(LPVOID pParam); надо действительно объявить
как статическую (статические функции практически то же самое, что и
глобальные - в них указатель this не передается, они просто принадлежат
пространству имен класса, членами которого являются) и передавать в нее
укзатель на объект класса.

Например, в диалоге есть кнопка, и из обработчика ее нажатия мы запускаем
поток :

class CFtpFirstDlg:public CDialog
{
.....
static UINT getDownloadFileFunc(LPVOID pParam);//Обьявлена такая функция
....
static CFtpConnection* pFtpConnect;
CInternetSessionEx* pSession;
....

afx_msg void OnButton1();

....
}

UINT CFtpFirstDlg::getDownloadFileFunc(LPVOID pParam)
{
CFtpFirstDlg *pDlg = (CFtpFirstDlg *) pParam;

CStdioFile *pFile = pDlg->OpenURL("http://SoftMaker.fatal.ru");

...

return 0;
}

void CThreadDlg::OnButton1()
{
AfxBeginThread(getDownloadFileFunc, (LPVOID) this);
}

в функции потока параметр приводим к указателю на объект класса, и юзаем
методы и свойства.

Вот так обычно и делают.

Vic.

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: http://subscribe.ru/member/unsub?grp=comp.soft.prog.prog&email=
http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   Tue, 11 Nov 2003 23:32:01 +0300 (#19476)

 

Спасибо Vic за развернутый ответ.

Еще один вопрос.

Здесь требуется ответ в виде схемы.
Есть локальная сеть. На удаленном компьютере запущена задача по перекачке
файлов с Ftp сервера (я ее пока дописываю) На компьтер за которым нахожусь я
приходит письмо с заданием в формате RTF c заданием на перекачку файлов в
виде списка.
Как на твой взляд организовать взаимодейсвие задач с передачей списка файлов

Владимир

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: http://subscribe.ru/member/unsub?grp=comp.soft.prog.prog&email=
http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   "vlad" Wed, 12 Nov 2003 20:19:03 +0500 (#19818)

 

Здравствуйте !

Звиняйте все, что так долго не появлялся.
Просто компы как и люди - тоже глючат :-)
.. процы греются, а термопасту ночью не достать ...

Вот тут я немного не понял - тебе надо отправить на удаленный комп
задание самому, или вопрос в том, как из RTF - а вытянуть инфу ?
Или как отослать на удаленный комп задание ? В смысле - как с процессом
на другом компе связаться ?

Vic.

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: http://subscribe.ru/member/unsub?grp=comp.soft.prog.prog&email=
http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   Fri, 14 Nov 2003 00:08:48 +0300 (#20427)

 

Да задача состоит из двух для меня пока незвестных
1. как зачитать файл типа RTF
2.как передать задание программе запущенной на удаленном компе в виде списка
имеется в виду нескольких строк

-----Original MessageFrom: Victor V. Vakchturov [mailto:forum-moderat***@m*****.ru]
Sent: Friday, November 14, 2003 2:09 AM
To: comp.soft.prog.prog (1840500)

Здравствуйте !

Звиняйте все, что так долго не появлялся.
Просто компы как и люди - тоже глючат :-)
.. процы греются, а термопасту ночью не достать ...

Вот тут я немного не понял - тебе надо отправить на удаленный комп
задание самому, или вопрос в том, как из RTF - а вытянуть инфу ?
Или как отослать на удаленный комп задание ? В смысле - как с процессом
на другом компе связаться ?

Vic.

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: http://subscribe.ru/member/unsub?grp=comp.soft.prog.prog&email=
http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   "vlad" Fri, 14 Nov 2003 19:25:19 +0500 (#20644)

 

Здравствуйте !

Ну, с этим все достаточно просто. Можно воспользоваться
возможностями стандартного контрола Windows - Rich Edit.
Это расширенный редактор. В него можно загрузить RTF,
а потом взять оттуда обычный текст и разобрать вручную.

Оконные классы (если на API писать) :
Для ричедита версии 1.0 - "RICHEDIT".
Для версий 2.0 и выше - "RichEdit20A" (для ANSI - версии),
"RichEdit20W" (Unicode версия).
Для того, чтобы просто переконвертировать RTF в текст
хватит ричедита версии 1.0.
В MFC есть класс CRichEditCtrl - обертка самого контрола,
CRichEditView - контрол в виде View (там добавлены обработчики
стандартных команд MFC, реализована вставка OLE - объектов,
реализована сериализация (загрузка/выгрузка) документов).

Для решения твоей задачи достаточно проинициализировать в программе
ричедит (загрузить соответствующую dll - ку) функцией AfxInitRichEdit,
создать скрытое окно и взять немного кода MFC, где производится
сериализация документа, грузить в ричедит сам RTF, а потом
взять обычный текст из ричедита либо при помощи GetWindowText,
либо при помощи сохранения из RichEdit в виде текста (у него есть
такая возможность).
Ну а потом - дело техники - разобрать по строкам.

Ну тут к твоим услугам полный спектр возможностей передачи данных.
Конечно же, первым решением напрашивается использовать сокеты.
Но для использования сокетов должны быть установлены и настроены службы
TCP IP. Однако, надо думать, если юзается инет на обоих компах, то
TCP должно быть.

Можно использовать майлслоты (MailSlots).

Если не заморачиваться (и, imho это самый легкий путь) , то можно
организовать соединение через поименованные каналы (Named Pipes).
Преимущество данного подхода в том, что не придется возиться с сокетами,
а можно будет использовать простые функции работы с файлами.
То есть можно открыть поименованный канал при помощи функции
CreateNamedPipe. Она возвратит дескриптор, который можно будет использовать
для операции ReadFile. CreateNamedPipe должна вызываться на принимающей
стороне (на том компе, где работает закачка).
На компе, где парсится RTF можно вызвать функции ConnectNamedPipe+WriteFile
или TransactNamedPipe для передачи данных.
Ложкой дегтя здесь является то, что CreateNamedPipe есть только в
WinNT 3.1 и выше/Win2000 (то есть на компе с задачей закачки должна быть NT
или 2k), ConnectNamedPipe тоже есть в NT/2k только. В Win98/95
есть только TransactNamedPipe.

Вот. Если что непонятно - могу расписать подробнее.

Vic.

P.S. Народ, может я чего забыл про возможности передачи данных по сетке ?

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: http://subscribe.ru/member/unsub?grp=comp.soft.prog.prog&email=
http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   Fri, 14 Nov 2003 21:54:17 +0300 (#20719)

 

Здравствуйте

Vic я попробовал класс CRichEditCrtl инициировал следующей строкой

m_edit.Create(WS_CHILD|WS_VISIBLE|WS_BORDER|ES_AUTOVSCROLL|ES_MULTILINE,CRec
t(10,10,620,390),this,IDC_RICHEDIT);

Далее при помощи файлового диалога зачитал туда построчно файл типа RTF.
Текст процедуры следующий:
void CDial_stDlg::OnButton1()
{
CFileDialog DlgOpen(TRUE,(LPCSTR)"rtf",NULL,
OFN_HIDEREADONLY|OFN_OVERWRITEPROMPT,
(LPCSTR)" Text Files (*.rtf) |*.rtf||");

// отображение стандартной панели выбора файла SaveAs
if(DlgOpen.DoModal()==IDOK)
{
// создание объекта и открытие файла для записи
CStdioFile File(DlgOpen.GetPathName(),
CFile::modeRead|CFile::typeBinary);
CString str,lstr;
LPCTSTR pstr;
File.ReadString(str);
lstr=str;
DWORD count=File.GetLength();
while(DWORD i=File.GetPosition()<count)
{
File.ReadString(str);
lstr+=str;
}
pstr=(LPCTSTR)lstr;
m_edit.SetWindowText(pstr);
//m_edit.MessageBox(pstr);

File.Close();

}

}
Все отлично отбражается в окне только вертикальный скрол не работает видно
только начало файла(наверне я что-то не указал при инициализации RichEdit)

Владимир

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: http://subscribe.ru/member/unsub?grp=comp.soft.prog.prog&email=
http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   "vlad" Sun, 16 Nov 2003 17:44:18 +0500 (#21138)

 

Здравствуйте !

На самом деле все немного не так надо делать. Файл RTF надо читать
стандартными
средствами ричедита. Как это сделано, можно посмотреть в исходниках MFC
Это функции CRichEditView::Serialize, CRichEditView::Stream,
CRichEditView::EditStreamCallBack.

А как выше сделано, получается такой прикол, что в ричедит попадает RTF
через m_edit.SetWindowText - это, наверно, неправильно (у класса
CRichEditCtrl
есть специальный метод Stream для выгрузки и загрузки текстов как в формате
RTF, так и обычного текста).

Еще один момент - вот ричедит в диалоге... Попробуйте открыть, например,
ворд, кинутьтуда текст, можно картинку, выделить все и перетащить в ричедит
на
диалоге... Если я не ошибаюсь, винда просто повиснет... Это из-за того, что
не реализован интерфейс, отвечающий за перетаскивание OLE - объектов.

А насчет загрузки-выгрузки попробую завтра примерчик наваять и с вами
поделиться (самому просто тоже интересно).

Vic.

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: http://subscribe.ru/member/unsub?grp=comp.soft.prog.prog&email=
http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   Mon, 17 Nov 2003 03:16:54 +0300 (#21256)

 

Да Vic согласен что-то я сделал неправильно.Дело в том что вроде-бы
нормально считался RTF в ХР а на работе у меня 98 и вот там оказалось что
пример не работает.
Поэтому вопрос как воспользоваться функцией StreamIn() в классе
CRichEditCtrl? Предположимбчто имя файла RTF нам известно.

Владимир

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: http://subscribe.ru/member/unsub?grp=comp.soft.prog.prog&email=
http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   "vlad" Mon, 17 Nov 2003 19:33:15 +0500 (#21602)

 

Привет !

Вот так можно загрузить файл :
Извиняйте, что пока ответ такой короткий - тороплюсь на работу
попозже - более в развернутом виде :-)

class _vRichEditCookie
{
public:

BOOL m_bSave;

CFile *m_pFile;

DWORD m_dwError;

_vRichEditCookie(CFile *pFile, BOOL bSave = FALSE)
{
m_dwError = 0;
m_pFile = pFile;
m_bSave = bSave;
}
};

// return 0 for no error, otherwise return error code
DWORD CALLBACK VEditStreamCallBack(DWORD dwCookie, LPBYTE pbBuff, LONG cb,
LONG *pcb)
{
_vRichEditCookie* pCookie = (_vRichEditCookie*) dwCookie;

*pcb = cb;

DWORD dw = 0;

CFile *pFile = pCookie->m_pFile;

try
{
if (pCookie->m_bSave)
pFile->WriteHuge(pbBuff, cb);
else
*pcb = pFile->ReadHuge(pbBuff, cb);
}
catch(CFileException *e)
{
*pcb = 0;
pCookie->m_dwError = (DWORD) e->m_cause;
dw = 1;

}
catch(CException *e)
{
*pcb = 0;
pCookie->m_dwError = (DWORD) CFileException::generic;
dw = 1;

}

return dw;
}

void CRichDlgDlg::OnButtonLoad()
{
CFileDialog dlg(TRUE, "rtf", NULL, OFN_HIDEREADONLY | OFN_OVERWRITEPROMPT,
"Файлы RTF (*.rtf)|*.rtf|Текстовые файлы (*.txt)|*.txt||");

if(dlg.DoModal() == IDOK)
{
CFile file;

if(file.Open(dlg.GetPathName(), CFile::modeRead))
{
EDITSTREAM es = { 0, 0, VEditStreamCallBack };

_vRichEditCookie cookie(&file);

es.dwCookie = (DWORD) &cookie;

int nFormat = (dlg.GetFileExt() == "rtf") ? SF_RTF : SF_TEXT;

m_wndEdit.StreamIn(nFormat, es);

file.Close();

m_wndEdit.Invalidate();

if(cookie.m_dwError != 0)
AfxThrowFileException(cookie.m_dwError);
}
else
MessageBox("Не удается открыть файл !");
}
}

Vic.

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: http://subscribe.ru/member/unsub?grp=comp.soft.prog.prog&email=
http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   Wed, 19 Nov 2003 08:32:38 +0300 (#22171)

 

Здравстуй Victor.

Здесь дома все зачиталось вместе с таблицами. Завтра попробую на работе тебе
напишу. Поясни мне пожалуста следующий момент.
При объявлении функции типа CALLBACK объявляется и ее параметры в данном
случае
DWORD CALLBACK VEditStreamCallBack(DWORD dwCookie, LPBYTE pbBuff, LONG
cb,LONG *pcb)
В теле основной процедуры имеется только ссылка на процедуру. Каков механизм
обмена параметрами?

Обязательно ли функции CALLBACK должны быть глобальными?

Владимир

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: http://subscribe.ru/member/unsub?grp=comp.soft.prog.prog&email=
http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   "vlad" Wed, 19 Nov 2003 20:59:43 +0500 (#22585)

 

Всем привет !

Все достаточно просто. Функцию можно объявить с любыми параметрами,
затем - продекларировать указатель на нее и по этому указателю вызвать.

Есть такая штука как соглашения вызова. Соглашения вызова определяют то,
какая сторона ответственна за очищение стека (вызывающая или вызываемая),
в каком порядке следуют аргументы, и.т.д. Для указания того, какое
соглашение
используется при вызове конкретной функции можно указывать _stdcall или
_cdecl.

При вызове функций через указатель важно знать соглашение взова функции,
которую вызываешь и продекларировать указатель соответствующим образом.

А параметры...

Параметры помещаются в стек один за другим. Имя функции для компилятора -
всего лишь метка (указатель, адрес которого заранее известен, если
упростить).

То есть при вызове функции вообще (через указатель, либо явно) в стек просто
кладуться параметры и совершается переход по указанному адресу. И в этом
смысле -
никаких отличий.

Лучше я приведу пример :

например напишем функцию :

void MyFunc(__int64 nNum) // в параметрах передаем ОДНО 64-х битное число
{
CString str;

str.Format("parameter_1 = %d\r\nparameter_2 = %d",
*((int *) &nNum),
*(((int *) &nNum) + 1));

AfxMessageBox((LPCTSTR) str);
}

и объявим тип p_f_ii - указатель на функцию, принимающую ДВА
параметра - 32-х битных числа.

typedef void (* p_f_ii) (int, int);

объявим указатель на функцию, приведем MyFunc к нему и
произведем вызов :

void CRtyDlg::OnButton1()
{
p_f_ii pointer_1 = (p_f_ii) MyFunc;
pointer_1(1, 2);
}

в результате получим как и передавали значения : 1 и 2.

В MyFunc мы просто получаем доступ в разным кусочкам 64-х
битного nNum :
к первым 32-м битам : *((int *) &nNum)
и к последующим : *(((int *) &nNum) + 1))

нет, не обязательно. Они могут быть статическими функциями-членами
классов. Недавно же обсуждалось то, что в нестатические функции-члены
классов передается this первым параметром, из-за чего ясно, что

void func()
{
}

и

void MyClass::func()
{
}

имеют разное число параметров (func - ни одного, а MyClass::func - один
неявный).

Vic.

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: http://subscribe.ru/member/unsub?grp=comp.soft.prog.prog&email=
http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   Thu, 20 Nov 2003 02:05:49 +0300 (#22671)

 

Привет Vic!
В начале о резльтатах получненных на работе.
Для усвоения урока решил на работе все набрать в ручную. Как вседа не
обошлось без ошибки в наборе. После чего потратил целый день на поиск, где
ошибка. С функциями CALL BACK принципиально все понятно но на практике еще
надо потренироваться.

Теперь далее.

Программу по перекачке файлов доделаю на следующей неделе. Но пока это будет
моно программа(все в одном) Далее ее надо будет разделить на удаленный
компанент и локальный.Везде будет работать Win98.Допустим остановимся на
поименнованных каналах.Насколько я понял можно использовать только
TransactNamedPipe.Набросай пожалуста схематично прогри принимающие и
передающие

Владимир

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: http://subscribe.ru/member/unsub?grp=comp.soft.prog.prog&email=
http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   "vlad" Fri, 21 Nov 2003 21:23:22 +0500 (#23652)

 

Здравствуйте !

Ну, это приходит с практикой...

Знаете прикол - "рабочий день программиста" ?

- приходит на работу
- идет, курит
- садится, и до обеда отлаживает 10 строк кода, написанные вчера.
- идет, курит
- идет на обед
- приходит, курит
- пишет еще 500 строк
- идет, курит
- идет домой :-)

Да... Наверно с этого и надо было начинать...
Кажется, создать поименованный канал можно только под
Win NT/2000/XP а в 95/98 - к каналу можно только подцепиться.
Если на всех тачках - 98-я, то, наверно, придется использовать
сокеты.

К сожалению, винду я переставил, и, как назло, оказался испорчен один
из компактов с MSDN - так что более подробно смогу написать только завтра -
когда MSDN принесу с работы.

Vic.

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: http://subscribe.ru/member/unsub?grp=comp.soft.prog.prog&email=
http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   Sat, 22 Nov 2003 00:53:53 +0300 (#23804)

 

Привет Vic!

Да в зтой работе из-за простой описки иногда тратишь столько времени, что
когда находишь причину просто дурно становится.

Пока до сокетрв не дошло задаю попутный вопрос, может у тебя так было.
Проект уже досаточно много в себя вобравший всякого вдруг перестает
выбрасывать контекстную подсказку на структуры класса ну допустим я объявил
CString st;
Теперь если писать st.(то появляется список всех процедур объекта) так вот у
меня на каком то этапе все это исчезло, хотя компилятор все транслирует и
объкты работают. Хотя и это не точно. Буквально вчера вечером обявляю
переменную
WIN32_FIND_DATA findData;
HANDLE hHand=FindFirstFile("*.rtf",&findData);
Компилятор без притензий. Начинаю отлаживать все как бы работает но доступа
к findData нет, я его не вижу в отладчике.
В любом другом проекте эта конструкция проходит на ура. В чем здесь гвоздь
не пойму?

Владимир

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: http://subscribe.ru/member/unsub?grp=comp.soft.prog.prog&email=
http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   "vlad" Sun, 23 Nov 2003 10:16:04 +0500 (#24182)

 

Здравствуйте !

Известные проблемы...
Это не все глюки VC++ 6.0., но это один из наиболее распространенных.
Еще бывает, когда классы в ClassWizard не показываются - но там простое
решение - стереть clw файл и перегенерить его заново.

Для решения таких проблем можно порекомендовать программу Visual Assist.

Более подробно - пиши на forum-moderat***@m*****.ru

Vic.

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: http://subscribe.ru/member/unsub?grp=comp.soft.prog.prog&email=
http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   Sun, 23 Nov 2003 11:07:22 +0300 (#24228)

 

Привет Vic!

Два дня потратил на разборку с 98 в прошлую субботу взял с собой файлы с
текстами писем и без особых проблем написал программку для разборки текста
но дама стоит ХР, а весь понедельник ушел на точ то пытался заставить
работать RichEditCtrl также как и в ХР, но к сожалению зто не удалось
главное часть функций работает правильео , а некоторые не работают (в
частности невозможно определить длину строки) поэтому сеодня нагородил там
что-то вроде работает но полнлй уверенности нет что это правильно (буду
поверять практикой)

forum-moderat***@m*****.ru это тоже типа дискусионный клуб. Как там
зарегистрироваться?

Владимир

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: http://subscribe.ru/member/unsub?grp=comp.soft.prog.prog&email=
http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   "vlad" Tue, 25 Nov 2003 19:52:18 +0500 (#25304)

 

Привет !

А не можете ли попродробней описать, какие глюки встретились ?
Просто есть такой прикол - RichEdit - он ведь тоже разных версий бывает.
В каталоге Windows, подкаталоге system32 можно поискать dll - ку с именем
riched32.dll - эта длл содержит ричедит версии 1.0.
Также с 98 - й винды там есть дллка - riched20.dll - в ней содержится
ричедит более поздней версии. В 98 - й винде ричедит 2.0.
В 2000 - й 3.0., в XP - 4.0. К тому же с офисом XP ставится ричедит версии
4.5.
Так вот например есть такой прикол - если вызвать для ричедита версии 1.0.
функцию GetWindowTextLength ( она возвращает длину текста в окне вместе с
символами перевода каретки), то возвращенное значение будет равно тому,
которое
получается, если получить из окна текст с помощью GetWindowText и найти его
длину с помощью например strlen или CString::GetLength.
А в ричедите 2.0. и выше значение возвращенное GetWindowTextLength больше
истинного
на число строк текста, содержащегося в окне. Вероятно, это связано с тем,
что
оконная процедура RichEdit - а 1.0. существует в ANSI - версии и в UNICODE
версии, а оконные процедуры ричедитов более старших версий - только в
UNICODE - виде,
и в поздних версиях ричедитов перевод строки кодируется большим количеством
байт.

Данет :-) Это просто адрес модерации этого листа - то есть это мой почтовый
ящик,
куа валятся все письма этого листа. Так что если написать на этот адрес, то
в ближайшее
время я прочитаю письмо.
Короче, если с рассылкой что то неладно, или возникли какие либо проблемы,
или есть
замечания по рассылке - пишите сюда.

Vic.

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: http://subscribe.ru/member/unsub?grp=comp.soft.prog.prog&email=
http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   Tue, 25 Nov 2003 22:39:18 +0300 (#25437)

 

Здравствуй Vic!
Проблема с RichEdit в следующем:
В 98 вычитывая строки из текста файла она как мне показалость по концу
строки вставку текста прекращает но старый текст не удаляет

Например предыдущая стпрока

Напрвляю вам для внедрения

Новая строка

Вышлите квитанцию

Итоговая строка RichEdit

Вышлите квитанциюля внедрения

Так как функция возврата длинны строки вовращает значение совершенно не
связанное с только что прочитанной строкой разобраться становится трудно
Я тоже подумалбчто либо версия не иа либо необходимо инициализировать
другими опциями. Если у тебя есть перечени всех его опций инициализации то
пришли мне.

И еще один вопрос гдето мне встречалась строка для вызова командной строки
из текста программы ну например вызвать arj x -v -y file но не помню где.
Так что пришли мне пожалуста как это правильно вызвать

Сегодня просто дописал FTP для перекачки многотомных архивов и хочу их
тут-же собирать

Владимир

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: http://subscribe.ru/member/unsub?grp=comp.soft.prog.prog&email=
http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   "vlad" Wed, 26 Nov 2003 21:25:16 +0500 (#25902)

 

Привет !

А вы как текст извлекаете ?

Попробуйте сделать вот так :

Допустим, есть объект m_wndRichEdit класса CRichEditCtrl, из которого надо
выделить все строки.

Вот пример :

int nLineLength, nLineCount = m_wndRichEdit.GetLineCount();

CString strText, strLine;

for(int i = 0; i < nLineCount; i++)
{
nLineLength = m_wndRichEdit.LineLength(i);

m_wndRichEdit.GetLine(i, strText.GetBufferSetLength(nLineLength),
nLineLength);

strText.ReleaseBuffer();

strLine.Format("Line %d : %s", i, (LPCTSTR) strText);

MessageBox((LPCTSTR) strLine);
}

Насчет инициализации - могу понадергать из MSDN описания стилей и
расширенных
стилей этого контрола. Это, вобщем то все что там может быть особенного.
Надо ?

Запускать другие процессы проще всего через функцию ShellExecute.
Точнее, функций то много (WinExec еще например, всякие функции Runtume -
библиотек). Самая общая функция - CreateProcess.
Но для простых задач удобнее всего пользоваться

Вот прототип :

HINSTANCE ShellExecute(
HWND hwnd,
LPCTSTR lpOperation,
LPCTSTR lpFile,
LPCTSTR lpParameters,
LPCTSTR lpDirectory,
INT nShowCmd
);

hwnd - дескриптор родительского окна (можно просто NULL указать).

lpOperation - строка, указывающая какое действие надо произвести.
Может быть :

edit - открывает документ на редактирование. При этом lpFile должен быть
именем файла документа (путь к нему).
explore - открывает папку, путь к которой задан в lpFile.
find - запускает поиск по директории.
open - запускает файл. Если это исполнимый файл, то запускает, иначе -
запускает
приложение, связанное с типом файла и через DDX передает туда имя файла
документа.
print - печатает документ, путь к которому в lpFile.
NULL

lpParameters - параметры - например параметры командной строки при запуске
экзешника.

lpDirectory - директория по умолчанию.

nShowCmd - флаги того, в каком состоянии запускать приложение. Это те же
флаги, что передаются в ShowWindow.
То есть :

SW_HIDE
SW_MAXIMIZE
SW_MINIMIZE
SW_RESTORE
SW_SHOW
SW_SHOWDEFAULT
SW_SHOWMAXIMIZED
SW_SHOWMINIMIZED
SW_SHOWMINNOACTIVE
SW_SHOWNA
SW_SHOWNOACTIVATE
SW_SHOWNORMAL

А пример запуска экзешника такой :

ShellExecute(/*например дескриптор окна какого нибудь*/ m_hWnd, "open",
"c:\\MyProgram.exe", NULL, NULL, SW_SHOWNORMAL);

В вашем случае можно :

ShellExecute(NULL, "open" "d:\\arj.exe", "x -v -y file", NULL,
SW_SHOWNORMAL);

Vic.

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: http://subscribe.ru/member/unsub?grp=comp.soft.prog.prog&email=
http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   Wed, 26 Nov 2003 22:52:00 +0300 (#25978)

 

Привет Vic!
Я сейчас поясню некоторые моменты вашего примера, как они работали в Win98

Эта функция возвращает ощее количество строк считанного текста т.е. работает
правильно

Данная функия возвращала мне не количетво считанных знаков, а количетво
знакомест(зависила от CRect строки инициализации)

Считывал я практически также,со следующим нюансом:
LPCTSTR strl;
strl= strText.GetBufferSetLength(nLineLength);
и уже далее m_wndRichEdit.GetLine(i,strl,nLineLength);
strText=(LPCTSTR)strl;
но думаю это одно и тоже

int ct=strText.Find("с именем",0); ищу ключевое слово за которым искомый
текст работет отлично
int cn=strText.GetLength();Функция работает как попало закономерности я не
обнаружил в ХР работет безупречно
далее функциями strText.Ringth(cn-ct); Должны отрезать левую часть строки
но так как cn неправильно вычесена получаем неверный результат
strText.Left(ct); отрезаем правую часть строки т.к не используется cn
работает нормально

}

Я думаю надо

Завтра попробую правда конец месяца напрягают со всякими отчетами

Владимир

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: http://subscribe.ru/member/unsub?grp=comp.soft.prog.prog&email=
http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   "vlad" Thu, 27 Nov 2003 20:45:46 +0500 (#26352)

 

Здравствуйте !

Ясно... У вас, наверно, просто у ричедита не стоял стиль ES_AUTOHSCROLL,
то есть возникал эффект 'автопереноса' строк.

Хорошо - тогда другой вариант :

m_wndRichEdit.GetWindowText(strText);

strText.Replace("\r\n", "\n");
strText.Replace('\r', '\n');

int nTextLen = strText.GetLength();

for(int nNextPos, nBegPos = 0;
nBegPos < nTextLen;
nNextPos ++, nBegPos = nNextPos)
{
nNextPos = strText.Find('\n', nBegPos);

if(nNextPos < 0)
nNextPos = nTextLen;

strLine = strText.Mid(nBegPos, nNextPos - nBegPos);

MessageBox(strLine);
}

Это стопудово работать как надо будет. Только вот строки :

strText.Replace("\r\n", "\n");
strText.Replace('\r', '\n');

они корректируют символы перевода строки, если вдруг вставлен
текст с какими либо странными последовательностями \r и \n
не на все случаи рассчитаны. Но весь код будет работать в 100%
случаев.

Ок, тогда в близайшее время напишу.

Vic.

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: http://subscribe.ru/member/unsub?grp=comp.soft.prog.prog&email=
http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   Fri, 28 Nov 2003 00:07:22 +0300 (#26497)

 

Здравствуй Vic!
На два дня отвлекся от копьютера но продолжим наше обсуждение

Да на самом деле зтот стиль не стоял, думаю его попробовать первым делом

А этот алгоритм в случае если не поможет стиль но это только с понедельника
смогу проверить

Теперь по ShellExecute(
HWND hwnd,
LPCTSTR lpOperation,
LPCTSTR lpFile,
LPCTSTR lpParameters,
LPCTSTR lpDirectory,
INT nShowCmd
);
Параметр lpOperation в письме имеет значения "print","find" в праве ли я
предположить что корректны комманды "copy","delete","md" и т.д.
Если нет то как их реализовать?

Владимир

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: http://subscribe.ru/member/unsub?grp=comp.soft.prog.prog&email=
http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   "vlad" Sun, 30 Nov 2003 16:14:17 +0500 (#27242)

 

Здравствуйте !

Тут по сути дела прикол вот в чем - GetLine для ричедита возвращает
строку именно так, как она представлена в самом элементе управления.
То есть как бы пользователь ее увидел.

А описанный метод просто разбирает текст из контрола на строки, считая
признаком окончания строки \r\n или \r, если после не идет \n

Нет, использоваться могут только описанные.
Это не команды даже. Это просто вид операции производимой.

Реализовать лучше средствами языка программирования.

Например для копирования есть API - функции :

BOOL CopyFile(
LPCTSTR lpExistingFileName,
LPCTSTR lpNewFileName,
BOOL bFailIfExists
);

и

BOOL CopyFileEx(
LPCTSTR lpExistingFileName,
LPCTSTR lpNewFileName,
LPPROGRESS_ROUTINE lpProgressRoutine,
LPVOID lpData,
LPBOOL pbCancel,
DWORD dwCopyFlags
);

вторая отличается от первой тем, что в нее можно передать
указатель на функцию обратного вызова (CALLBACK) и на основе этого,
например, сделать индикатор копировния.

Vic.

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: http://subscribe.ru/member/unsub?grp=comp.soft.prog.prog&email=
http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   Sun, 30 Nov 2003 16:04:39 +0300 (#27280)

 

Hello Victor,

Sunday, November 30, 2003, 6:04:39 PM, you wrote:

Здравствуйте !

Сегодня все это применил в своем алгоритме все заработало ОК.
До этого у меня был свой алгоритм но по сравнению с вашим он более
тяжеловесный и запутанный и надежды на него еще меньше. Так что быдем
считать что с этим разобрались

это для копирования а для удаления?

Владимир

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: http://subscribe.ru/member/unsub?grp=comp.soft.prog.prog&email=
http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   bvb Mon, 1 Dec 2003 20:18:23 +0500 (#27828)

 

Здравствуйте !

Это для копирования.
CopyFile просто копирует файл.
Например :

::CopyFile("c:\\file_exist.txt", "d:\\new_file.txt", TRUE);

скопирует файл c:\\file_exist.txt в d:\\new_file.txt причем
если d:\\new_file.txt уже есть, то вернет FALSE.
Если бы последний параметр был FALSE, то если бы d:\\new_file.txt
уже существовал, то функция бы его переписала.

С CopyFileEx все немного сложнее, в нее в качестве параметра
lpProgressRoutine
передается указатель на функцию вида :

DWORD CALLBACK CopyProgressRoutine(
LARGE_INTEGER TotalFileSize,
LARGE_INTEGER TotalBytesTransferred,
LARGE_INTEGER StreamSize,
LARGE_INTEGER StreamBytesTransferred,
DWORD dwStreamNumber,
DWORD dwCallbackReason,
HANDLE hSourceFile,
HANDLE hDestinationFile,
LPVOID lpData
);

то есть функцию обратного вызова, которая вызывается переодически из
CopyFileEx.

Для перемещения файла есть функции :

BOOL MoveFileEx(
LPCTSTR lpExistingFileName,
LPCTSTR lpNewFileName,
DWORD dwFlags
);

и

BOOL MoveFileWithProgress(
LPCTSTR lpExistingFileName,
LPCTSTR lpNewFileName,
LPPROGRESS_ROUTINE lpProgressRoutine,
LPVOID lpData,
DWORD dwFlags
);

для удаления есть :

BOOL DeleteFile(
LPCTSTR lpFileName
);

тут все просто - передается имя файла, который надо удалить.

В MFC есть класс CFile. У него есть несколько статических функций.

Функция

static void PASCAL CFile::Remove(
LPCTSTR lpszFileName
);

удаляет файл. То есть :

CFile::Remove("c:\\asd.txt"); удалит c:\\asd.txt

и есть функция

static void PASCAL CFile::Rename(
LPCTSTR lpszOldName,
LPCTSTR lpszNewName
);

она переименовывает файл :

CFile::Rename("c:\\asd.txt", "c:\\qwe.txt"); переименует c:\\asd.txt в
c:\\qwe.txt

Вот такие дела.

Если надо, могу потом быстренько примерчики накрапать.

Vic.

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: http://subscribe.ru/member/unsub?grp=comp.soft.prog.prog&email=
http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   Mon, 1 Dec 2003 22:00:31 +0300 (#27982)

 

Привет Vic!

Я готов получить от вас пример классов CAsyncSocket и
CSocket MFC.

CHATSRVR - программа-сервер.
CHATTER - программа-клиент.

Пока можно и без коментариев , ну а по мере освоения возникнут и
вопросы

Владимир

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: http://subscribe.ru/member/unsub?grp=comp.soft.prog.prog&email=
http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   bvb Sun, 7 Dec 2003 13:53:13 +0500 (#30879)

 

Здравствуйте!
А вот и вопрос.

И так создаем два проекта в VC++ при помощи MFC AppWizard.
Первй проект называем pusto на первом шаге Step1 устанавливаем Dialog
based. На втором шаге Step2 снимаем все крыжики на третьем ничего не
меняем даем Finish первый прект готов.
Создаем второй проект pustoSocket отличие от первого на втором шаге
устанвливаем крыжик в поле Windows Sockets все остальное как и в первом
Путем сличения сгенерированных текстов выясняется что во втором
проекте имеется только одно отличие в процедуре InitInstance() в ней
добавлены следующие строки
if (!AfxSocketInit())
{
AfxMessageBox(IDP_SOCKETS_INIT_FAILED);
return FALSE;
}
Резонно предположить что вставив данные строки в первый проект получим
полный эквивалент второго. Однако это не так первый проект после
данного усовершенствования дает ошибку при компиляции на
AfxSocketInit() и IDP_SOCKETS_INIT_FAILED

Подскажите в чем здесь причина ошибки?

Владимир

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: http://subscribe.ru/member/unsub?grp=comp.soft.prog.prog&email=
http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   bvb Thu, 18 Dec 2003 20:16:03 +0500 (#37749)

 

Здравствуйте !

Это надо смотреть в настройках проекта.
Возможно, объявлена какая то директива для подключения в ресурс
таблицы строк нужных строк.

Вот тут : http://SoftMaker.com.ru/articles/mfc/mfc_standard_res.htm
написано про внутренние ресурсы библиотеки MFC.
IDP_SOCKETS_INIT_FAILED - один из элементов таблицы строк,
лежащей, кажется в mfcloc42.dll (название типа этого - не гарантирую
точность). Так что сравнивать еще надо и служебные файлы проекта.
А лучше прям по настройкам полазить.

С уважением, Вахтуров Виктор.
Информационный сайт для программистов http://SoftMaker.com.ru

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: mailto:comp.soft.prog.prog--unsub@subscribe.ru

http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   Fri, 19 Dec 2003 21:00:21 +0300 (#38723)

 

Hello Victor,

Friday, December 19, 2003, 11:00:21 PM, you wrote:

Спасибо Виктор!
Да на самом деле, вчера внимательно изучил все файлы входящие в проект
и нашел в StdAfx.h строку на подключение заголовка <AfxSocket.h>
после этого проекты стали полностью идентичны

Владимир

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: mailto:comp.soft.prog.prog--unsub@subscribe.ru

http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   bvb Sat, 20 Dec 2003 07:22:14 +0500 (#38861)

 

Здравствуй Виктор!

Посмотри пожалуста примеры в MSDN для организации связи с почтовым
сервером. Установления коннекта чтения и отправки почты. И если есть
вышли на мой майл.
Спасибо

Владимир
Получить правила : mailto:comp.soft.prog.prog-rules@subscribe.ru
Формат "дайджест" : mailto:comp.soft.prog.prog-digest@subscribe.ru
Формат "каждое письмо" : mailto:comp.soft.prog.prog-normal@subscribe.ru
Формат "читать с веба" : mailto:comp.soft.prog.prog-webonly@subscribe.ru

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: mailto:comp.soft.prog.prog--unsub@subscribe.ru

http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   bvb Sat, 10 Jan 2004 08:24:38 +0500 (#50919)

 

Здравствуйте !

Да, похоже пайпы в клиент-серверной архитектуре можно использовать,
если только программа-сервер работает на NT/2000/XP.

Поэтому надо решать задачу при помощи сокетов. Это классы CAsyncSocket и
CSocket MFC.

В примерах MSDN есть два проекта - пример простого чата (в локальной сети,
например) :

CHATSRVR - программа-сервер.
CHATTER - программа-клиент.

Сделаны на сокетах. Можно посмотреть.

В ближайшее время посмотрю сам и выложу сюда получившееся наброски.

Vic.

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: http://subscribe.ru/member/unsub?grp=comp.soft.prog.prog&email=
http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   Sat, 22 Nov 2003 22:24:24 +0300 (#24086)

 

Рад приветствовать, Victor!

Довелось мне Saturday, November 08, 2003 читать, следующее:

..

Кстати, а можно ли в .NET компилировать в обычный ехе без привязки к
FrameWork (так кажется оно называется), чтобы как в старой - доброй
студии?
А ещё, ничего не подскажешь на счёт реализации доступа к портам
(скажем, COM) в вин32? Вот в ДОСе всё было ясно, делаешь outportb и
никаких проблем, а тут ведь как-то его захватить надо (?), и общаться
не напрямую, а через ядро системы?
Заранее спасибо.

Alles Gutes!

CU @ http://smuta.boom.ru
...In Code We Trust...
При желании, mailto:deniskravtso***@m*****.ru

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: http://subscribe.ru/member/unsub?grp=comp.soft.prog.prog&email=
http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   Thu, 13 Nov 2003 19:19:50 +0300 (#20330)

 

Здравствуйте !

Вроде, можно. Я, правда сам 7-ю студию не юзал - только MSDN
ставил 2003 - й.

В вин32 стандартно доступ к портам можно организовать через файловые
операции.
То есть что то типа этого :

/* A sample program to illustrate setting up a serial port. */

#include <windows.h>

int
main(int argc, char *argv[])
{
DCB dcb;
HANDLE hCom;
BOOL fSuccess;
char *pcCommPort = "COM2";

hCom = CreateFile( pcCommPort,
GENERIC_READ | GENERIC_WRITE,
0, // comm devices must be opened w/exclusive-access
NULL, // no security attributes
OPEN_EXISTING, // comm devices must use OPEN_EXISTING
0, // not overlapped I/O
NULL // hTemplate must be NULL for comm devices
);

if (hCom == INVALID_HANDLE_VALUE) {
// Handle the error.
printf ("CreateFile failed with error %d.\n", GetLastError());
return (1);
}

// We will build on the current configuration, and skip setting the size
// of the input and output buffers with SetupComm.

fSuccess = GetCommState(hCom, &dcb);

if (!fSuccess) {
// Handle the error.
printf ("GetCommState failed with error %d.\n", GetLastError());
return (2);
}

// Fill in the DCB: baud=57,600 bps, 8 data bits, no parity, and 1 stop
bit.

dcb.BaudRate = CBR_57600; // set the baud rate
dcb.ByteSize = 8; // data size, xmit, and rcv
dcb.Parity = NOPARITY; // no parity bit
dcb.StopBits = ONESTOPBIT; // one stop bit

fSuccess = SetCommState(hCom, &dcb);

if (!fSuccess) {
// Handle the error.
printf ("SetCommState failed with error %d.\n", GetLastError());
return (3);
}

printf ("Serial port %s successfully reconfigured.\n", pcCommPort);
return (0);
}

еще отношение к этому имеет группа функций озаглавленная в MSDN как
"Communication Functions".

В MSDN есть статья "Serial Communications in Win32" - там что то тоже
написано.

А вообще для любоге устройство можно открыть CreateFile.

Типа такого :

CreateFile(
"\\\\.\\DEVICE_NAME", // address of name of the communications
device
fdwAccess, // access (read-write) mode
0, // share mode
NULL, // address of security descriptor
OPEN_EXISTING, // how to create
0, // file attributes
NULL // handle of file with attributes to copy
);

DEVICE_NAME - имя устройства.

Смотрел сайт - прикольно :-)

Vic.

-*Информационный канал Subscribe.Ru
Написать в лист: mailto:comp.soft.prog.prog-list@subscribe.ru
Отписаться: http://subscribe.ru/member/unsub?grp=comp.soft.prog.prog&email=
http://subscribe.ru/ mailto:ask@subscribe.ru

Ответить   Thu, 13 Nov 2003 23:53:32 +0300 (#20426)