powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / PBNI Wizard
43 сообщений из 43, показаны все 2 страниц
PBNI Wizard
    #39495818
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть PBNIWizard (в комплекте PB10.5), но как понимаю старый, т.к. инстал при старте выдает ошибку:
---------------------------
Windows Script Host
---------------------------
Сценарий: C:\Program Files (x86)\Sybase\PowerBuilder 10.5\SDK\PBNI\Wizards\VCWizards\PBNIWizard8\install.wsf
Строка: 7
Символ: 8
Ошибка: Неверная ссылка на корень в разделе реестра "HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\8.0\Setup\VC\ProductDir".
Код: 80070002
Источник: WshShell.RegRead
-------------------------

На ПК VS2017, NET 4.6, W7 (64).

Что сделать, чтобы установить PBNIWizard и пользоваться?
...
Рейтинг: 0 / 0
PBNI Wizard
    #39495889
Фотография spas2001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Он на директорию похоже ругается
Попробуйте поставить в корень диска C:
...
Рейтинг: 0 / 0
PBNI Wizard
    #39495911
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
spas2001Он на директорию похоже ругается
Попробуйте поставить в корень диска C:
Эт я понимаю.
Возможно будет достаточно в файлах deploy.bat и install.wsf скорректировать соответствующие названия и значения переменных, по аналогии различий между одноименными файлами в каталогах PBNIWizard (7.0) и PBNIWizard8 (8.0).
В первом ссылка на:
"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\7.0\Setup\VC\ProductDir"
а во втором ссылка на:
"HKEY_LOCAL_MACHINE\SOFTWARE\Microsoft\VisualStudio\8.0\Setup\VC\ProductDir"

Но у меня VS2017 (15.0) и W7 (64) и такого раздела реестра нет.

К тому же, в обоих вариантах файлов указывается соответственно:
"C:\Program Files\Microsoft Visual Studio 7"
"C:\Program Files\Microsoft Visual Studio 8"
а у меня скорее всего надо указать:
"C:\Program Files (x86)\Microsoft Visual Studio"
а может и продолжить путь по имеющейся цепочке:
"C:\Program Files (x86)\Microsoft Visual Studio\2017"
т.к. другого не вижу.
...
Рейтинг: 0 / 0
PBNI Wizard
    #39496225
Hennadiy
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AIS, возможно я не прав, но судя по всему проблема в несовместимости 32/64 битных приложений. Как вариант, смоделировать ситуатуцию на 32 виртуалке.
...
Рейтинг: 0 / 0
PBNI Wizard
    #39496319
Фотография spas2001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сам создай ключи, в чем проблема?
Ну и поставить соота=ветственно VC 7.0 и 8.0
...
Рейтинг: 0 / 0
PBNI Wizard
    #39496343
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
spas2001Сам создай ключи, в чем проблема?
Ну и поставить соота=ветственно VC 7.0 и 8.0
Проблема в том, что для VS2017 не знаю куда, что прописывать, чтобы была "правильная" связь с РВ (установка PBNI).
Задачу решил установкой VS2015. Хотя для него чуть пришлось пути допилить (таки W7 и х64 в тандеме дали свое Г), но все получилось.
ПС. Конечно жалко, что такое с VS2017 не получилось, да и хрен с ним.
...
Рейтинг: 0 / 0
PBNI Wizard
    #39620462
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Подниму тему, нужен совет или комментарий по опыту.
Сделал внешнее решение одной и той же задачи при помощи DLL с экспортированной функцией и через PBX. И то и другое работает. Возник вопрос:
Что предподчительней использовать в проекте DLL или PBX?
...
Рейтинг: 0 / 0
PBNI Wizard
    #39620607
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AIS,

C PBNI больше возможностей. Например можно напрямую обращаться к объектам и вызывать функции ПБ из С++.
Но с ним больше мороки по поддержке при выходе новых версий ПБ.
Так что если возможностей DLL хватает то есть смысл именно этот вариант использовать, а перейти на PBNI только когда вознитнет необходимость.
...
Рейтинг: 0 / 0
PBNI Wizard
    #39620639
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky,

Спасибо за совет. Да, согласен, с PBX хлопот больше, но есть и не малые плюсы.
На счет проблем с выходом новых версий РВ, то это наверное решающий фактор, т.к. в последних версиях PBX уже не идет в комплекте, а ориентир на VS, если я не ошибаюсь.

А если смотреть с точки зрения защиты кода, т.е. спрятать, то DLL снова проигрывает, или без разницы?
...
Рейтинг: 0 / 0
PBNI Wizard
    #39620763
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AISА если смотреть с точки зрения защиты кода, т.е. спрятать, то DLL снова проигрывает, или без разницы?
Без разницы. И то и то - DLL
...
Рейтинг: 0 / 0
PBNI Wizard
    #39620790
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyAISА если смотреть с точки зрения защиты кода, т.е. спрятать, то DLL снова проигрывает, или без разницы?
Без разницы. И то и то - DLL
С этим, конечно, не спорю. Но если только просто поверхностно взглянуть на экспортируемые функции DLL и PBX, то это большая разница: у DLL - все как на ладони*, а у PBX - уй поймешь* о чем они. Не правда ли?
...
Рейтинг: 0 / 0
PBNI Wizard
    #39622492
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Создаю в PBX функцию вычисления MD5 из переданного строкового аргумента:
MD5 не работает с входящим аргументом
Код: 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.
55.
56.
57.
58.
HCRYPTPROV CryptProv;
HCRYPTHASH CryptHash;
BYTE BytesHash[16];
DWORD dwHashLen = 16;
_TCHAR theOut[MAX_PATH];

/* если задаю аргумент так, работает правильно */
// char *data = "test f_md5";
/* если беру входящий аргумент "test f_md5" из функции f_md5(ref string), то не работает правильно */
////////
char *data;
LPCTSTR lptheInput = NULL;
pbstring val = ci->pArgs->GetAt(0)->GetString();
lptheInput = m_pSession->GetString(val);
data = (LPSTR)lptheInput;
///////

BYTE *pbBuffer = (BYTE*)data;
DWORD dwBufferLen = strlen(data);
if (CryptAcquireContext(&CryptProv,
	NULL, NULL, PROV_RSA_FULL, CRYPT_VERIFYCONTEXT | CRYPT_MACHINE_KEYSET))
	{
		if (CryptCreateHash(CryptProv, CALG_MD5, 0, 0, &CryptHash))
		{
			if (CryptHashData(CryptHash, pbBuffer, dwBufferLen, 0))
			{
				if (CryptGetHashParam(CryptHash, HP_HASHVAL, BytesHash, &dwHashLen, 0))
				{
					CHAR hexcharset[] = "0123456789abcdef";
					for (int j = 0; j < dwHashLen; j++)
					{
						theOut[j*2] = hexcharset[BytesHash[j] >> 4];
						theOut[(j*2)+1] = hexcharset[BytesHash[j] & 0x0F];
					}

				}
				else {
					//"Error CryptGetHashParam";
				}
			}
			else {
				//"Error CryptHashData";
			}
		}
		else {
			//"Error CryptCreateHash";
		}
	}
	else {
		//"Error CryptAcquireContext";
	}
	CryptDestroyHash(CryptHash);
	CryptReleaseContext(CryptProv, 0);

         ci->returnValue->SetString(theOut);

}
return pbxr;


Где ошибка или как правильно сделать?
...
Рейтинг: 0 / 0
PBNI Wizard
    #39622605
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AIS
Код: plaintext
1.
data = (LPSTR)lptheInput;


data - указатель на строку в кодировке ANSI
lptheInput - указатель на строку в кодировке Unicode (UTF-16)

Во-первых, нельзя так принудительно менять тип, не преобразовав данные (там потом следующий strlen() неверно отрабатывает, и может еще какие-то эффекты).
Во-вторых, вам надо решить в каком формате вы будете строку передавать в MD5 (UTF-16 или UTF-8). ANSI - не всегда годится, т.к. будут потери символов не входящих в текущую кодовую страницу.
В-третьих, надо помнимать что MD5 от одной и той же строки в ANSI, UTF-16 и в UTF-8 будут разные.
Эта тема уже обсуждалась где-то здесь. Мое мнение - если MD5 потом передается в третьи приложения, то лучше UTF-8, т.к. для английского текста ANSI и UTF-8 совпадают, т.е. больше вероятность совместимости.
В любом случае предлагаю преобразование кодировки делать на стороне ПБ функцией Blob() со вторым параметром - кодировкой. А в модуль передавать blob и его длину, и уже его хешировать.
...
Рейтинг: 0 / 0
PBNI Wizard
    #39622844
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky,

премного благодарен, таки да, с blob и UTF-8 все встало на свои места.
Еще буквально недавно Вы мне это же советовали в другой ситуации, видать не внял, все string примеряю...))
Спасибо за помощь.
...
Рейтинг: 0 / 0
PBNI Wizard
    #39623682
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще вопрос, на который не могу найти ответа.

Получаю в PB экземпляр класса и передаю его в PBNI:
Код: sql
1.
2.
3.
/* например */
ClassDefinition lcd 
lcd = nuo_test.ClassDefinition 


а как потом получить свойства класса на стороне PBNI? Например, lcd.LibraryName.
...
Рейтинг: 0 / 0
PBNI Wizard
    #39624013
avs63
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
См. документацию по PBNI:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
cls = session-> GetClass(dwobj);
   fid = session-> GetFieldID(cls, "visible");
   if (fid == kUndefinedFieldID) 
      return;
   isTrue = session-> GetBoolField(dwobj, fid, isNull); 
   if (isTrue)
      session -> SetBoolField(dwobj, fid, false);
    else
      session -> SetBoolField(dwobj, fid, true);
    return ;
...
Рейтинг: 0 / 0
PBNI Wizard
    #39624076
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
avs63См. документацию по PBNI:

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
cls = session-> GetClass(dwobj);
   fid = session-> GetFieldID(cls, "visible");
   if (fid == kUndefinedFieldID) 
      return;
   isTrue = session-> GetBoolField(dwobj, fid, isNull); 
   if (isTrue)
      session -> SetBoolField(dwobj, fid, false);
    else
      session -> SetBoolField(dwobj, fid, true);
    return ;


Да вроде читал...
Для начала у меня не получается даже fid получить. Так как в доках выдает ошибку, а если так:
Код: plaintext
1.
2.
3.
...
fid = session-> GetFieldID(cls, (LPCTSTR) "visible");
...

то получаю UndefinedFieldID.
В чем причина?

РВ10.5
...
Рейтинг: 0 / 0
PBNI Wizard
    #39624117
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Упс, нашел ошибку. Все работает. Всем спасибо.
...
Рейтинг: 0 / 0
PBNI Wizard
    #39624372
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AISЕще вопрос, на который не могу найти ответа.

Получаю в PB экземпляр класса и передаю его в PBNI:
Код: sql
1.
2.
3.
/* например */
ClassDefinition lcd 
lcd = nuo_test.ClassDefinition 


а как потом получить свойства класса на стороне PBNI? Например, lcd.LibraryName.
Да, если передаю в PBNI параметром lcd, то могу получить lcd.LibraryName.
А как получить LibraryName ничего вообще не передавая на PBNI?
Вот например:
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
...
LPCTSTR GroupName = (LPCTSTR) "test_app"; /* AppName */
pbgroup group = session->FindGroup(GroupName, pbgroup_application);
if (group == NULL) {
   ci->returnValue->SetString(_T("Group is NULL"));
} else {
   /* получаю класс в текущей библиотеке */
   pbclass cls = session->FindClass(group, GroupName); 
   if (cls == NULL) {
      ci->returnValue->SetString(_T("Class is NULL"));
   } else {
      LPCTSTR FieldName = (LPCTSTR)"classdefinition";
      pbfieldID fid = session->GetFieldID(cls, FieldName);
      if (session->IsFieldObject(cls, fid)) {
         /* сюда не проходит, хотя ClassDefinition должен быть PowerObject */
      } else {
         ci->returnValue->SetString(_T("NOT IsFieldObject"));
      }
   }
}


Что не так? Можно ли таким способом получить LibraryName?
...
Рейтинг: 0 / 0
PBNI Wizard
    #39624774
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AISЧто не так?
Вот так нельзя делать:
Код: sql
1.
(LPCTSTR) "строка"


Все такие места в коде надо заменить на
Код: sql
1.
_T("строка")



И вообще, если у вас в коде есть конструкция (тип) перед выражением, то там скореее всего проблема. Лучше заменить ее на конструкцию static_cast<тип>(выражение).
Тогда компилятор сам подскажет вам когда нельзя так делать ))
...
Рейтинг: 0 / 0
PBNI Wizard
    #39624862
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky,

спасибо за помощь, поменял.
Теперь получилось получить, например, значение свойства "displayname" приложения.
А вот дальше не могу понять, что делать, чтобы получить свойство "classdefinition" приложения, которое является объектом, и далее получить из него значение LibraryName.
Если есть возможность, то подскажите хоть схематически, как это делается.
...
Рейтинг: 0 / 0
PBNI Wizard
    #39625200
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AIS,

Что-то типа этого. (Только добавить проверки на успешность выполнения)
Код: plaintext
1.
2.
3.
pbclass cls = session->FindClass(group, GroupName)
pbfieldID fid = session->GetFieldID(cls, _T("classdefinition"));
pbobject clsdef = session->GetObjectField(cls, fid, isNull);



Если это не сработает, то приведите ваш код - может по нему что-то будет видно.
У меня нет Винды с ПБ под рукой, поэтому больше ничем помочь не могу, кроме проверки вашего кода в форуме )).
...
Рейтинг: 0 / 0
PBNI Wizard
    #39625206
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А вообще, classdefinition это же свойство объекта, а не класса.
Поэтому вам надо этот объект (приложение?) передать в pbni, и для него вызывать
GetFieldID и GetObjectField
...
Рейтинг: 0 / 0
PBNI Wizard
    #39625362
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky,
PB: событие "open" приложения
Код: sql
1.
2.
3.
string ls_rtn
ls_rtn = f_test(this) /* вызов функции PBX */
MessageBox("test", ls_rtn)


PBX: после корректировки
Код: 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.
...
pbboolean isNull;
/* передаю параметр - объект приложения */
pbobject obj = ci->pArgs->GetAt(0)->GetObject();
pbclass cls = ci->pArgs->GetAt(0)->GetClass();
if (cls == NULL) {
   ci->returnValue->SetString(_T("Class is NULL"));
}
else {
   LPCTSTR FieldName = _T("classdefinition");
   pbfieldID fid = session->GetFieldID(cls, FieldName);
   if (fidcls == kUndefinedFieldID) {
      ci->returnValue->SetString(_T("Undefined FieldID"));
   }
   else {
      /* в GetObjectField нужен таки объект, а не класс */
      pbobject objclsdef = m_pSession->GetObjectField(obj, fid, isNull);
      if (objclsdef == NULL) {
	 ci->returnValue->SetString(_T("ObjectField is NULL"));
      }
      else {
	 ci->returnValue->SetString(_T("ObjectField is NOT NULL")); /* сюда доходит */
      }
   }
}


А дальше не пойму как получить из PBX значение libraryname, который в РВ в событии "open" приложения можно получить так:
Код: sql
1.
2.
3.
ClassDefinition lcd
lcd = this.ClassDefinition
ls_Fullpath = lcd.LibraryName
...
Рейтинг: 0 / 0
PBNI Wizard
    #39625589
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AIS,
Код: plaintext
1.
2.
3.
4.
pbobject objclsdef = session->GetObjectField(obj, fid, isNull);  // это у вас уже есть
pbclass clsdefcls = objclsdef->GetClass();
pbfieldID library_fid = session->GetFieldID(clsdefcls, _T("libraryname"));
pbstring lirary_name = session->GetStringField(objclsdef, library_fid, isNull);
...
Рейтинг: 0 / 0
PBNI Wizard
    #39625624
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyAIS,
Код: plaintext
1.
2.
3.
4.
pbobject objclsdef = session->GetObjectField(obj, fid, isNull);  // это у вас уже есть
pbclass clsdefcls = objclsdef->GetClass();
pbfieldID library_fid = session->GetFieldID(clsdefcls, _T("libraryname"));
pbstring lirary_name = session->GetStringField(objclsdef, library_fid, isNull);


У-уф, наконец то получилось.
Только 2-ю строчку скорректировал на
Код: plaintext
1.
pbclass clsdefcls = session->GetClass(objclsdef);


и все поехало.
Огромное человеческое спасибо за помощь.
...
Рейтинг: 0 / 0
PBNI Wizard
    #39627674
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Можно ли из PBNI и если да, то как, экстренно закрыть приложение РВ, вызвав на прямую функцию "Halt" или "Halt Close", и не создавая при этом на стороне РВ для этого событие или функцию? В какую сторону смотреть или искать?
...
Рейтинг: 0 / 0
PBNI Wizard
    #39627676
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AISМожно ли из PBNI и если да, то как, экстренно закрыть приложение РВ, вызвав на прямую функцию "Halt" или "Halt Close", и не создавая при этом на стороне РВ для этого событие или функцию? В какую сторону смотреть или искать?
Вопрос снимается, поторопился задать.
...
Рейтинг: 0 / 0
PBNI Wizard
    #39627772
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AISМожно ли из PBNI и если да, то как, экстренно закрыть приложение РВ, вызвав на прямую функцию "Halt" или "Halt Close", и не создавая при этом на стороне РВ для этого событие или функцию? В какую сторону смотреть или искать?
Ан нет, таки вопрос ещё актуален...
вызов системной функции РВ
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
pbgroup sysGroup = m_pSession->GetSystemGroup();
pbclass cls = m_pSession->FindClass(sysGroup, (LPCTSTR)_TEXT("SystemFunctions"));
if (cls == NULL) {
   ci->returnValue->SetString(_T("Class is NULL"));
}
else {
   LPCTSTR f_name = _T("halt");
   LPCTSTR signature = _T(""); /* ? */
   /* так не работает */
   //pbmethodID mid = m_pSession->FindMatchingFunction(cls, f_name, PBRT_FUNCTION, signature);
   /* и так тоже не работает */
   pbmethodID mid = m_pSession->GetMethodID(cls, f_name, PBRT_FUNCTION, signature);
   if (mid == kUndefinedMethodID) {
	ci->returnValue->SetString(_T("UndefinedMethodID Halt"));
   }
   else {
       ... /* сюда уже не доходит */
   }
}


Вроде пошагово делаю правильно, но не работает. Думаю, что ошибка в установке signature. Пробовал разные варианты (пусто, Q, S), но ничего не помогло.
А может в скрипте ошибка?
...
Рейтинг: 0 / 0
PBNI Wizard
    #39627847
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AIS,

Если надо реально просто закрыть приложение, то просто вызовите функцию WinAPI для этого:
Код: sql
1.
ExitProcess(10 /*exit code*/);
...
Рейтинг: 0 / 0
PBNI Wizard
    #39627934
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyAIS,

Если надо реально просто закрыть приложение, то просто вызовите функцию WinAPI для этого:
Код: sql
1.
ExitProcess(10 /*exit code*/);


Спасибо, за совет. Если не найду решения, то так и сделаю.
Кстати, вот это из примера в доках:
Код: sql
1.
2.
3.
LPCTSTR f_name = _T("double");
LPCTSTR signature = _T("DA");
pbmethodID mid = m_pSession->GetMethodID(cls, f_name, PBRT_FUNCTION, signature);


работает, а с "halt" - нет. Ну, да ладно...

А вообще, я так понимаю что, то что сделано на стороне РВ лучше в PBX не перетягивать. Одним словом проще WinAPI использовать в PBX, чем РВ.
...
Рейтинг: 0 / 0
PBNI Wizard
    #39630382
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Снова о Halt, уж больно стало интересно...
В списке системных функций её нет. Есть только упоминание в help.
Может это не системная функция, тогда что это?
...
Рейтинг: 0 / 0
PBNI Wizard
    #39630421
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AIS,

Так HALT это не функция, а оператор, как RETURN
...
Рейтинг: 0 / 0
PBNI Wizard
    #39630446
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyAIS,

Так HALT это не функция, а оператор, как RETURN
Вот пазлы и сложились, чего вызов не работал. Что то перемкнуло с этим HALT, что это системная функция.
Спасибо за ликбез, сразу попустило...))
...
Рейтинг: 0 / 0
PBNI Wizard
    #39634644
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Очередной вопросик.
Если нужны в РВХ функции для внутренних вычислений, т.е. которые не взаимодействуют с РВ, то как их создать?

ПС. сделал тестовую функцию "test", которая вычисляет и передает значение "int" функции, которую можно вызвать из РВ и увидеть это значение. Вроде все работает, но в РВ-проекте появилась глобальная функция "int" без каких либо свойств. Если бы появилась "test", то хоть бы как то было оправдано, хотя и не понятно почему, но тут "int". Видать где-то что-то не так делаю или не доделал. Может кто подскажет...
...
Рейтинг: 0 / 0
PBNI Wizard
    #39635520
Oleg1
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
AIS, как на С функции пишутся, так и делать. PBX тут вообще ни каким боком.
Писать PBNI-объявления необходимо только для того, что вызывает непосредственно билдер.
...
Рейтинг: 0 / 0
PBNI Wizard
    #39647443
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Еще пару вопросов.
1.
Почему в РВ и в PBNI вызов CreateFile по разному?
Код: sql
1.
2.
3.
4.
/* в РВ так работает */
lul_hDisk = CreateFile( "\\.\c:", 0, FILE_SHARE_READ_OR_WRITE, 0, OPEN_EXISTING, 0, 0)
/* а так нет */
lul_hDisk = CreateFile( "\\.\PhysicalDrive0", 0, FILE_SHARE_READ_OR_WRITE, 0, OPEN_EXISTING, 0, 0)


Код: plaintext
1.
2.
3.
4.
5.
6.
/* в PBNI так работает */
CreateFile(L"\\\\.\\PhysicalDrive0", 0, FILE_SHARE_READ | FILE_SHARE_WRITE,
					NULL, OPEN_EXISTING, 0, NULL);
/* а так нет */
CreateFile(L"\\.\c:", 0, FILE_SHARE_READ | FILE_SHARE_WRITE,
					NULL, OPEN_EXISTING, 0, NULL);



2.
есть в PBNI такой кусок работающего кода:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
// Set the input data structure
STORAGE_PROPERTY_QUERY storagePropertyQuery;
ZeroMemory(&storagePropertyQuery, sizeof(STORAGE_PROPERTY_QUERY));
storagePropertyQuery.PropertyId = StorageDeviceProperty;  //=0
storagePropertyQuery.QueryType = PropertyStandardQuery; //=0

// Get the necessary output buffer size
STORAGE_DESCRIPTOR_HEADER storageDescriptorHeader = { 0 };
DWORD dwBytesReturned = 0;
if (!::DeviceIoControl(hDevice, IOCTL_STORAGE_QUERY_PROPERTY,
	&storagePropertyQuery, sizeof(STORAGE_PROPERTY_QUERY),
	&storageDescriptorHeader, sizeof(STORAGE_DESCRIPTOR_HEADER),
	&dwBytesReturned, NULL))
{
	dwRet = ::GetLastError();
	::CloseHandle(hDevice);
	return dwRet;
}



попытался его перенести в РВ:
Код: sql
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.
nvo_sizeof	uo_sizeof
	
STORAGE_PROPERTY_QUERY query
query.PropertyId = StorageDeviceProperty
query.QueryType = PropertyStandardQuery
lul_lpInBuffer = uo_sizeof.sizeof(query)
	
STORAGE_DESCRIPTOR_HEADER storageDescriptorHeader
lul_lpOutBuffer = uo_sizeof.sizeof(storageDescriptorHeader)
lul_lpBytesReturned = 0

If DeviceIoControl( lul_hDisk, IOCTL_STORAGE_QUERY_PROPERTY,
	query, lul_lpInBuffer, storageDescriptorHeader,
	lul_lpOutBuffer, lul_lpBytesReturned, 0) = 0 Then
	Messagebox("STORAGE_QUERY_PROPERTY", "INVALID_HANDLE_VALUE")
Else
	Messagebox("STORAGE_QUERY_PROPERTY", "OK")
End If
/*
Function boolean DeviceIoControl ( &
	ulong hDevice,&
	ulong dwIoControlCode,&
	Structure lpInBuffer,&
	ulong nInBufferSize,&
	ref Structure lpOutBuffer,&
	ulong nOutBufferSize,&
	ref ulong lpBytesReturned,&
	ulong lpOverlapped &
	) LIBRARY "kernel32.dll"
*/



не работает. Где то ошибка или это в принципе не возможно на РВ?
...
Рейтинг: 0 / 0
PBNI Wizard
    #39647549
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AIS
Код: plaintext
1.
L"\\.\c:"


В С++ это неверная строка. \с - это спецсимвол.
Должно быть:
Код: plaintext
1.
L"\\\\.\\c:"



Остальное не смотрел - некогда
...
Рейтинг: 0 / 0
PBNI Wizard
    #39647623
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly MoskovskyAIS
Код: plaintext
1.
L"\\.\c:"


В С++ это неверная строка. \с - это спецсимвол.
Должно быть:
Код: plaintext
1.
L"\\\\.\\c:"



Остальное не смотрел - некогда
Упс! Точно, спасибо.
...
Рейтинг: 0 / 0
PBNI Wizard
    #39651436
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Уперся еще в один вопрос - передача параметра между функциями внутри PBNI.
Например, в PBNI создал две тестовые функции Rand и Randomize, которые вызывают соответственно одноименные системные функции РВ.
Обе функции по отдельности работают. Но как в PBNI из одной функции (Rand) вызвать другую (Randomize), а точнее передать параметр и принять его, не пойму.
Как правильно передавать параметры между функциями внутри PBNI?
...
Рейтинг: 0 / 0
PBNI Wizard
    #39654423
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вопрос чисто риторический, и возможно не в том форуме, то прошу прошения... ;)
А может не хрен постигать "шедевры" PBNI, чтобы доточить в то, что уже "мертво", то чего в нем при жизни не было? Может уже давно пора просто "это все" делать на с++ и еб&ть себе мозги? (прошу извинить за прямоту, но уже с PBNI мозги набекрень...)
...
Рейтинг: 0 / 0
PBNI Wizard
    #39655508
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AIS,

В С++ большой порог вхождения. Нужны годы чтобы достичь хотя бы среднего уровня.
Лучше C# или там Java.
Но надо помнить, что то что в ПБ дает сам язык (например DW) в других языках возможно придется самому реализовать.
...
Рейтинг: 0 / 0
PBNI Wizard
    #39660348
Фотография Richard18
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Как вариант, смоделировать ситуатуцию на 32 виртуалке.
...
Рейтинг: 0 / 0
43 сообщений из 43, показаны все 2 страниц
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / PBNI Wizard
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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