Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / C++ [игнор отключен] [закрыт для гостей] / Нифика не пойму в чем трабл в VC++ 6.0 работало на "Ура" / 17 сообщений из 17, страница 1 из 1
19.06.2006, 14:48
    #33799922
Alexey-M
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нифика не пойму в чем трабл в VC++ 6.0 работало на "Ура"
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
51.
52.
53.
54.
#import "vfp9r.dll" rename_namespace("VFPLib2")  
  #define _s(x) CString((x))
  #define _ld(i) LoadReferI(parm->p[(i)].loc);

  extern const IID IID_Application ={0x002D2B12, 0xC1FA, 0x4193,  
  {0xB1, 0x34, 0xD8, 0x6E, 0xAE, 0xCC ,0x52, 0x50}};  // vfp 9.0
 
  ApplicationPtr pVfpTimer; 
  map <UINT,char*> mListTimers; // карта таймеров

  
  int LoadReferI(Locator Loc)
{
	Value Val={ 0 };
	ZeroMemory(&Val, sizeof(Value));
	int iErrCode=  _Load(&Loc, &Val);
	if(Val.ev_type!='I' && iErrCode!= 0 ) return NULL;
	return (Val.ev_long);
}


  void CSetTimer(ParamBlk FAR *parm)
{
long hWnd,nIDTimer,uElapse,IDisp;
hWnd     = _ld( 0 );
nIDTimer = _ld( 1 );
uElapse  = _ld( 2 );
IDisp    = _ld( 3 );

BOOL bRez=TRUE;
CoInitialize(NULL);
IDispatch* _vfpapp = (IDispatch*)IDisp;
ApplicationPtr pVfpTimer  =  _com_ptr_t<ApplicationPtr>(_vfpapp);
if (pVfpTimer!=NULL)
	 bRez = SetTimer((HWND)hWnd,(UINT)nIDTimer,(UINT)uElapse,(TIMERPROC)TimerProc);
else bRez =  FALSE;
   
CoUninitialize();
_RetLogical(bRez); 
}


void CALLBACK  TimerProc(HWND hwnd, UINT msg, UINT idTimer, DWORD dwTime) 
{
CoInitialize(NULL);
char *czObj;
map<UINT,char*>::iterator p=mListTimers.find(idTimer);
if (p!=mListTimers.end()) czObj=p->second;
CString sCmd = _s(czObj)+_s(".")+_s("TimerEvents()");
BSTR _bstr_cmd = sCmd.AllocSysString();
_bstr_t _bstr_do(_bstr_cmd,TRUE);
if(pVfpTimer==NULL) pVfpTimer->DoCmd(_bstr_do);pVfpTimer->DoCmd(_bstr_t("? 'Error'"));
SysFreeString( _bstr_cmd);
CoUninitialize(); 
} 

Вот с какого перепугаp VfpTimer в TimerProc == NULL ?
Мождет маршалить ? Но ! без маршалинга под 6.0 работало и даже не заикалось.
...
Рейтинг: 0 / 0
19.06.2006, 16:45
    #33800437
maXmo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нифика не пойму в чем трабл в VC++ 6.0 работало на "Ура"
Код: plaintext
if(pVfpTimer==NULL) pVfpTimer->DoCmd(_bstr_do);pVfpTimer->DoCmd(_bstr_t("? 'Error'"));
по-моему, это не должно работать.
...
Рейтинг: 0 / 0
19.06.2006, 16:48
    #33800451
Alexey-M
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нифика не пойму в чем трабл в VC++ 6.0 работало на "Ура"
maXmo,"отец", ну ошибся чуток.
Ты ясное дело видишь что не:
if(pVfpTimer==NULL) pVfpTimer->DoCmd(_bstr_do);pVfpTimer->DoCmd(_bstr_t("? 'Error'"));
а:
if(pVfpTimer==NULL)
pVfpTimer->DoCmd(_bstr_do);
else pVfpTimer->DoCmd(_bstr_t("? 'Error'"));

в чем трабл, вот в чем вопрос.
...
Рейтинг: 0 / 0
19.06.2006, 16:48
    #33800454
maXmo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нифика не пойму в чем трабл в VC++ 6.0 работало на "Ура"
Код: plaintext
ApplicationPtr pVfpTimer  =  _com_ptr_t<ApplicationPtr>(_vfpapp);
присвоил значение локальной переменной и радуешься?
...
Рейтинг: 0 / 0
19.06.2006, 16:50
    #33800464
maXmo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нифика не пойму в чем трабл в VC++ 6.0 работало на "Ура"
Код: plaintext
1.
2.
if(pVfpTimer==NULL)
pVfpTimer->DoCmd(_bstr_do);
else pVfpTimer->DoCmd(_bstr_t("? 'Error'"));
всё равно в случае pVfpTimer==NULL будет Access Violation
...
Рейтинг: 0 / 0
19.06.2006, 17:00
    #33800519
Alexey-M
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нифика не пойму в чем трабл в VC++ 6.0 работало на "Ура"
Никуя, она у меня
Код: plaintext
 ApplicationPtr pVfpTimer;  
глобально.
> всё равно в случае pVfpTimer==NULL будет Access Violation
Опять никуя. Все работае четко , но не так на надо по логике.
Выполнятся вот это:
Код: plaintext
pVfpTimer->DoCmd(_bstr_t("? 'Error'"));  
Но тут:
Код: plaintext
 ApplicationPtr pVfpTimer  =  _com_ptr_t<ApplicationPtr>(_vfpapp); 
pVfpTimer не NULL 100%.
...
Рейтинг: 0 / 0
19.06.2006, 17:14
    #33800589
maXmo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нифика не пойму в чем трабл в VC++ 6.0 работало на "Ура"
функции CSetTimer на твою глобальную pVfpTimer куй положить, у ней своя локальная pVfpTimer есть, и она её юзает, значение глобальной не меняется. Это называется "экранирование глобальной переменной".

зы это не код, это АХТУНГ!
...
Рейтинг: 0 / 0
19.06.2006, 17:19
    #33800619
maXmo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нифика не пойму в чем трабл в VC++ 6.0 работало на "Ура"
и всё-таки разберись с этим if-else, очень уж он подозрительно выглядит :)
а вообще спасибо, развеселил
...
Рейтинг: 0 / 0
19.06.2006, 17:23
    #33800633
Alexey-M
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нифика не пойму в чем трабл в VC++ 6.0 работало на "Ура"
maXmo, да "отец" нормально у меня и с иф и с елзе. Ну бывает, рука дрогнула :)) Косяк-то в чем ?
...
Рейтинг: 0 / 0
19.06.2006, 17:24
    #33800645
Alexey-M
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нифика не пойму в чем трабл в VC++ 6.0 работало на "Ура"
>зы это не код, это АХТУНГ!
Я тщеславием не страдаю ;)
...
Рейтинг: 0 / 0
19.06.2006, 17:29
    #33800676
maXmo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нифика не пойму в чем трабл в VC++ 6.0 работало на "Ура"
попробуй вместо
Код: plaintext
ApplicationPtr pVfpTimer  =  _com_ptr_t<ApplicationPtr>(_vfpapp);
написать
Код: plaintext
pVfpTimer  =  _com_ptr_t<ApplicationPtr>(_vfpapp);

проверка:
Код: plaintext
1.
if(pVfpTimer!=NULL)pVfpTimer->DoCmd(_bstr_do);
else pVfpTimer->DoCmd(_bstr_t("? 'Error'")); //я отказываюсь в это верить
...
Рейтинг: 0 / 0
19.06.2006, 17:34
    #33800699
Alexey-M
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нифика не пойму в чем трабл в VC++ 6.0 работало на "Ура"
maXmo, давай тогда без голословных интелектуальных хамств. Что тебе в коде не нравиться ? И вообще в чем проблема ? Для "особо одаренных" еще раз повторяю. В 6.0 работало на "Ура". В VS 2005 ни ошибок , но и не работает :)
...
Рейтинг: 0 / 0
19.06.2006, 21:06
    #33801165
Alexey-M
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нифика не пойму в чем трабл в VC++ 6.0 работало на "Ура"
Что-то я ручник включил :)
pVfpTimer = _com_ptr_t<ApplicationPtr>(_vfpapp);
прокатило! (Нафига я ее локальной сделал , загадка )
пасиба!!!
...
Рейтинг: 0 / 0
19.06.2006, 23:35
    #33801290
Alexey-M
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нифика не пойму в чем трабл в VC++ 6.0 работало на "Ура"
maXmo, пиво куда слать ? Приз за выдержку :)
...
Рейтинг: 0 / 0
20.06.2006, 00:52
    #33801355
Alexey-M
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нифика не пойму в чем трабл в VC++ 6.0 работало на "Ура"
Заработало! А че трахался-то ? А-то, что штатный таймер Visual Fox Pro копит WM_TIMER в очереди сообщений при условии, что время исполнения кода > времени интервала события. По пьяни они его писали что ли. Балбесы.
...
Рейтинг: 0 / 0
20.06.2006, 13:01
    #33802318
maXmo
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нифика не пойму в чем трабл в VC++ 6.0 работало на "Ура"
Alexey-MЧто тебе в коде не нравиться?ну попробуй такой код где-нить выполнить:
Код: plaintext
1.
pVfpTimer=NULL;
pVfpTimer->DoCmd(_bstr_t("? 'Error'"));
нормально работает?
...
Рейтинг: 0 / 0
11.07.2006, 01:29
    #33843756
Alexey-M
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Нифика не пойму в чем трабл в VC++ 6.0 работало на "Ура"
maXmo, спасибо.
...
Рейтинг: 0 / 0
Форумы / C++ [игнор отключен] [закрыт для гостей] / Нифика не пойму в чем трабл в VC++ 6.0 работало на "Ура" / 17 сообщений из 17, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]