powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Как вызвать функцию в DLL
25 сообщений из 29, страница 1 из 2
Как вызвать функцию в DLL
    #39567325
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть DLL.
исходник на С++
Код: 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.
#ifndef _ICiFbEncActivator_H_
#define _ICiFbEncActivator_H_

#if (defined(WIN32) || defined(_WIN32) || defined(__WIN32__)) && !defined(__MINGW32__)
	#define CALL_CONV   __stdcall
	#define CI_LIB_EXP __declspec(dllexport)
	#define NO_VTBL __declspec(novtable)
#else
	#define CALL_CONV
	#define CI_LIB_EXP
	#define NO_VTBL
#endif

#define CI_LIB_API extern "C" CI_LIB_EXP

enum CIErrors
{
	Err_OK = 0,
	Err_IncorrectCall = -1,
	Err_IncorrectSize = -2,
	Err_CantAllocMemory = -3,
	Err_AlreadyInSameState = -4,
	Err_FirebirdState = -5,
	Err_IncorrectParam = -6,
	Err_NullPointer = -7
};

namespace CI {
#pragma pack(push,1)
	struct DBEncInf
	{
		size_t PageSize;
		size_t PagesCount;
		size_t ProcessedPage;
		bool isEncrypted;
		bool inProcess;
	};
#pragma pack(pop)
	class CI_LIB_EXP NO_VTBL ICiFbEncActivator
	{
	public:
		virtual int32_t CALL_CONV SetKey (const void *pKey, size_t nKeyLen) = 0;
		virtual int32_t CALL_CONV SetDBAccess(const char* pDBAlias, const char* pDBLogin, const char* pDBPass) = 0;
		virtual int32_t CALL_CONV Activate(void) = 0;
		virtual int32_t CALL_CONV Encrypt(void) = 0;
		virtual int32_t CALL_CONV Decrypt(void) = 0;
		virtual int32_t CALL_CONV GetState(DBEncInf& inf) = 0;
		virtual int32_t CALL_CONV GetStateSVC(char* pBuf, size_t& nBuf) = 0;
		virtual int32_t CALL_CONV GetFBStat(char* pBuf, size_t& nBuf) = 0;
		virtual void CALL_CONV Destroy(void) = 0;
	};
}

#endif


исходник на Делфи
Код: pascal
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.
unit CI.ICiFbEncActivator;
interface
type
DBEncInf = record
	PageSize : NativeUInt;
	PagesCount : NativeUInt;
	ProcessedPage : NativeUInt;
	isEncrypted : Boolean;
	inProcess : Boolean;
end;
ICiFbEncActivator = class
  function SetKey(const pKey : Pointer; nKeyLen : NativeUInt) : Integer; virtual; stdcall; abstract;
  function SetDBAccess(const pDBAlias : PAnsiChar; const pDBLogin : PAnsiChar; const pDBPass : 
  function Activate : Integer; virtual; stdcall; abstract;
  function Encrypt : Integer; virtual; stdcall; abstract;
  function Decrypt : Integer; virtual; stdcall; abstract;
  function GetState(var inf : DBEncInf) : Integer; virtual; stdcall; abstract;
  function GetStateSVC(pBuf : PAnsiChar; var nBuf : NativeUInt) : Integer; virtual; stdcall; abstract;
  function GetFBStat(pBuf : PAnsiChar; var nBuf : NativeUInt) : Integer; virtual; stdcall; abstract;
end;

TActivatorFunction = function( out ppEncActivator : ICiFbEncActivator) : Integer; stdcall;

const
        Err_OK = 0;
	Err_IncorrectCall = -1;
	Err_IncorrectSize = -2;
	Err_CantAllocMemory = -3;
	Err_AlreadyInSameState = -4;
	Err_FirebirdState = -5;
	Err_IncorrectParam = -6;
	Err_NullPointer = -7;
implementation
end.


Как правильно в РВ вызывать эти функции?
...
Рейтинг: 0 / 0
Как вызвать функцию в DLL
    #39567588
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Продолжу.
Есть пример решения .
исходник С++
Код: 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.
59.
60.
61.
62.
63.
64.
65.
66.
67.
// Загружаем модуль
std::unique_ptr<HINSTANCE__, decltype(&::FreeLibrary)> mHandle(
	::LoadLibraryEx(L"C:\\TESTAPP\\CiFbEnc_x86.dll",0,LOAD_WITH_ALTERED_SEARCH_PATH),
	&::FreeLibrary);

if (!mHandle)
{
	MessageBox(
		NULL,
		L"Модуль CiFbEnc_x86.dll не найден или рядом с ним нет fbclient.dll",
		L"Загрузка модуля",
		MB_OK|MB_ICONERROR);

	return;
}
// Получаем активатор
typedef CALL_CONV int(__stdcall *CREATEFUNCPTR)(CI::ICiFbEncActivator**);
CREATEFUNCPTR GetActivator = 
(CREATEFUNCPTR)::GetProcAddress(mHandle.get(), "createCiFBEncActivator");

if (!GetActivator)
{
	MessageBox(
		NULL,
		L"Не удалось получить из модуля CiFbEnc_x86.dll процедуру" 
              "createCiFBEncActivator"
		 " - попробуйте посмотреть, что пишет tdump.",
		L"Загрузка модуля",
		MB_OK|MB_ICONERROR);

	return;
}

CI::ICiFbEncActivator* pActivator = NULL;
GetActivator(&pActivator);
if (!pActivator) { ShowMessage("ERROR GetActivator!"); return; }

// . . .
// пример обращения к объекту модуля активации
// . . .

pActivator->SetDBAccess("localhost:TESTDB", "SYSDBA", "masterkey");

char stat_buf[1024] = { 0 };
size_t bufsize = sizeof(stat_buf);

int res = pActivator->GetStateSVC(stat_buf, bufsize);
String sStatMsg = (String)stat_buf;
if (Err_OK == res)
{
	MessageBox(NULL, sStatMsg.c_str(), L"Статус БД", MB_OK|MB_ICONINFORMATION);
}
else
{
	String sErrMsg = L"ERROR GetStateSVC: " + sStatMsg;
	MessageBox(
		NULL,
		sErrMsg.c_str(),
		L"Статус БД",
		MB_OK|MB_ICONERROR);

}
. . .

// Уничтожаем экземпляр активатора
pActivator->Destroy();
pActivator = NULL;


исходник Делфи
Код: pascal
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.
59.
60.
61.
62.
63.
64.
65.
66.
67.
68.
69.
70.
71.
72.
var
pActivator : ICiFbEncActivator;
res : Integer;
CreateActivator: TActivatorFunction;
mHandle : HINST;
. . .
begin
// Загружаем модуль
mHandle := LoadLibraryEx(
PChar('C:\TESTAPP\CiFbEnc_x86.dll'), 0, LOAD_WITH_ALTERED_SEARCH_PATH);

if mHandle = 0 then
begin
     MessageBox(
        Application.Handle,
        'Модуль CiFbEnc_x86.dll не найден или рядом с ним нет fbclient.dll',
        'Загрузка модуля',
        MB_OK OR MB_ICONERROR);
      Exit;
end;

// Получаем активатор
CreateActivator := GetProcAddress(mHandle, 'createCiFBEncActivator');
if not Assigned(CreateActivator) then
begin
     MessageBox(
        Application.Handle,
        'Не удалось получить из модуля CiFbEnc_x86.dll процедуру createCiFBEncActivator'
        +
        ' - попробуйте посмотреть, что пишет tdump.',
        'Загрузка модуля',
        MB_OK OR MB_ICONERROR);

      Exit;
end;

pActivator := nil;
res := CreateActivator(pActivator);
if not Assigned(pActivator) then begin ShowMessage('ERROR CreateActivator!'); Exit; end;

// . . .
// пример обращения к объекту модуля активации
// . . .
var
. . .
stat_buf : array[0..1023] of AnsiChar;
bufsize : NativeUInt;
. . .
res := pActivator.SetDBAccess('localhost:TESTDB', 'SYSDBA', 'masterkey');

bufsize := SizeOf(stat_buf);
ZeroMemory(@stat_buf, bufsize);
res := pActivator.GetStateSVC(stat_buf, bufsize);

if Err_OK = res then
begin
       MessageBox(Application.Handle, PChar(String(stat_buf)),
       'Статус БД', MB_OK OR MB_ICONINFORMATION);
end
else
begin
       MessageBox(Application.Handle, PChar(String(stat_buf)),
       'Ошибка', MB_OK OR MB_ICONERROR);
end;
// . . .
 
// Уничтожаем экземпляр активатора
pActivator.Destroy;
pActivator := nil;

FreeLibrary(mHandle);
end;


частично перевел на РВ
Код: 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.
31.
32.
33.
34.
35.
36.
37.
38.
// получение доступа к интерфейсу модуля активации
long ll_handle, ll_CreateActivator
string ls_path
boolean lb_freelib

ls_path = 'C:\TESTAPP\CiFbEnc_x86.dll'
// Загружаем модуль
ll_handle = LoadLibrary( ls_path)

if ll_handle=0 then
	MessageBox( "Загрузка модуля", &
		"Модуль CiFbEnc_x86.dll не найден или рядом с ним нет fbclient.dll", &
		StopSign!)
	RETURN
end if

// Получаем активатор
ll_CreateActivator = GetProcAddress(ll_handle, 'createCiFBEncActivator')
if IsNull( ll_CreateActivator) then
     MessageBox( "Получение активатора", &
       	"Не удалось получить из модуля CiFbEnc_x86.dll процедуру createCiFBEncActivator" + &
		"~n- попробуйте посмотреть, что пишет tdump.", &
		StopSign!)
	GOTO str_return
end if

/*
вот здесь сложность перевода на РВ "обращения к объекту модуля активации"
*/

str_return:
	// Освобождаем модуль
	lb_freelib = FreeLibrary( ll_handle)
	if NOT lb_freelib then
		MessageBox( "Освобождение модуля", &
			"Модуль CiFbEnc_x86.dll не был освобожден", &
			StopSign!)
	end if


Кто то может подсказать как фрагмент "обращение к объекту модуля активации" в примере перевести на РВ? Или может есть другой вариант решения?
...
Рейтинг: 0 / 0
Как вызвать функцию в DLL
    #39567606
Dim2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
10.12.2017 17:37, AIS пишет:

> Как правильно в РВ вызывать эти функции?

Никак. А тому, кто экспортировал из DLL класс, нужно забить в голову гвоздь.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как вызвать функцию в DLL
    #39567649
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dim200010.12.2017 17:37, AIS пишет:

> Как правильно в РВ вызывать эти функции?

Никак. А тому, кто экспортировал из DLL класс, нужно забить в голову гвоздь.

А кроме "гвоздя" что-то ещё посоветуете? ))
...
Рейтинг: 0 / 0
Как вызвать функцию в DLL
    #39567920
Фотография spas2001
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Совет стандартный - написать "обертку" на С++, которую можно подцепить в билдер.
...
Рейтинг: 0 / 0
Как вызвать функцию в DLL
    #39568227
Dim2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
11.12.2017 14:03, AIS пишет:

> А кроме "гвоздя" что-то ещё посоветуете? ))

Я не совсем понимаю, почему это работает в Дельфи (хотя догадка
имеется), а вы хотите, чтобы я знал, как это заставить работать в эхотаге...
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как вызвать функцию в DLL
    #39568481
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dim2000Я не совсем понимаю, почему это работает в Дельфи (хотя догадка
имеется), а вы хотите, чтобы я знал, как это заставить работать в эхотаге...

Вы точно не из Москвы, а скорее из Одессы...)))
...
Рейтинг: 0 / 0
Как вызвать функцию в DLL
    #39569105
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dim2000Я не совсем понимаю, почему это работает в Дельфи (хотя догадка
имеется), а вы хотите, чтобы я знал, как это заставить работать в эхотаге...
Работает потому что классы в дельфи специально сделаны бинарно совместимыми с COM интерфейсами Винды.
А COM-интерфейсы это и есть классы С++ с виртуальными функциями .
Dim2000Никак. А тому, кто экспортировал из DLL класс, нужно забить в голову гвоздь.
Плюсую ))

ЗЫ. AIS, пишите обертки на С++.
...
Рейтинг: 0 / 0
Как вызвать функцию в DLL
    #39569223
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky,
я уже так и понял, что вариантов других нет.
...
Рейтинг: 0 / 0
Как вызвать функцию в DLL
    #39596236
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вроде сделал тестовую "обертку". Все работает, кроме вызова одной функции, у которой в параметрах структура. Выдает ошибку (-1) некорректный вызов.
функция GetState в исходнике
Код: 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.
#ifndef _ICiFbEncActivator_H_
#define _ICiFbEncActivator_H_

#if (defined(WIN32) || defined(_WIN32) || defined(__WIN32__)) && !defined(__MINGW32__)
	#define CALL_CONV   __stdcall
	#define CI_LIB_EXP __declspec(dllexport)
	#define NO_VTBL __declspec(novtable)
#else
	#define CALL_CONV
	#define CI_LIB_EXP
	#define NO_VTBL
#endif

#define CI_LIB_API extern "C" CI_LIB_EXP

enum CIErrors
{
	Err_OK = 0,
	Err_IncorrectCall = -1,
	Err_IncorrectSize = -2,
	Err_CantAllocMemory = -3,
	Err_AlreadyInSameState = -4,
	Err_FirebirdState = -5,
	Err_IncorrectParam = -6,
	Err_NullPointer = -7
};

namespace CI {
#pragma pack(push,1)
	struct DBEncInf
	{
		size_t PageSize;
		size_t PagesCount;
		size_t ProcessedPage;
		bool isEncrypted;
		bool inProcess;
	};
#pragma pack(pop)
	class CI_LIB_EXP NO_VTBL ICiFbEncActivator
	{
	public:
		... /* как вызвать эту функцию и принять структуру с результатом выполнения*/
		virtual int32_t CALL_CONV GetState(DBEncInf& inf) = 0;
                ...
	};
}

#endif


Как эту функцию (GetState) правильно вызвать и принять структуру с результатом выполнения?
...
Рейтинг: 0 / 0
Как вызвать функцию в DLL
    #39599631
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AIS,

Среды ПБ у меня нет, так что написать из головы как должно быть не могу.
Приведите код который сейчас есть (выдающий ошибку).
Я подскажу что поправить (если увижу в чем проблема).
...
Рейтинг: 0 / 0
Как вызвать функцию в DLL
    #39599637
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Ну, вот вроде, что нужно было имею в dll-обертке.
А как быть с подключением к БД в частности через Odbc?
Логичней было бы сразу в dll-обертке после установки ключа доступа к БД сразу и подключиться (сделал работает), но как тогда это подключение использовать в РВ не пойму?
С другой стороны после установки ключа не удалять его, а подключение сделать в РВ (тоже работает), но тогда ключ остается активированным до конца работы приложения, что как мне кажется небезопасно.
Может кто что посоветует или направит мысли в нужное русло, как правильней подключаться к БД?
...
Рейтинг: 0 / 0
Как вызвать функцию в DLL
    #39609261
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Есть еще один вопрос.
Из РВ вызываю из dll-обертки функцию test(), все работает:
C++
Код: 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.
//test.cpp
...
#define EXPORT extern "C" __declspec(dllexport)
#define PBCALL __stdcall

EXPORT void PBCALL test()
{
...
const uint8_t key[24] = {
    	0x06,0xDE,0x81,0xA1,0x30,0x55,0x1A,0xC9,
    	0x9C,0xA3,0x42,0xA9,0xB6,0x0F,0x54,0xF0,
    	0xB6,0xF9,0x70,0x18,0x85,0x04,0x83,0xBF
     };

int res_SetKey = pActivator->SetKey(&Key, sizeof(Key));
...

//test.h
...
class CI_LIB_EXP NO_VTBL ICiFbEncActivator
	{
	public:
                ...
		virtual int32_t CALL_CONV SetKey (const void *pKey, size_t nKeyLen) = 0;
                ...
	};
...
}



Хотелось бы ещё вывести массив key из dll в РВ и передавать его в качестве параметра функции test(). Как задать в РВ такой массив и правильно его передать в dll?

P.S. буксую ещё на sizeof(). Может этот параметр тоже надо (лучше) формировать в РВ и передавать ввиде параметра в dll?
...
Рейтинг: 0 / 0
Как вызвать функцию в DLL
    #39609594
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AIS,

Для массивов байтов удобно пользоваться типом blob.
Аргумент внешней функции объявить ref blob
Размер естественно надо передавать еще одним аргументом (long)

Вместо blob можно попробовать массив byte
...
Рейтинг: 0 / 0
Как вызвать функцию в DLL
    #39609610
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
См также как создавать блоб из произвольных байтов - 2634026
...
Рейтинг: 0 / 0
Как вызвать функцию в DLL
    #39619884
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky ,
спасибо за советы, помогло.
...
Рейтинг: 0 / 0
Как вызвать функцию в DLL
    #39660349
Фотография Richard18
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Совет стандартный - написать "обертку" на С++
...
Рейтинг: 0 / 0
Как вызвать функцию в DLL
    #39680694
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вроде уже собрал тестовую dll-у, и вроде уже все работало и в среде РВ, и в ЕХЕ-файле, но оказалось, что только на том ПК (Win7/64), где собирал (Dev-C++).
Собрал аналогичное в PBNI на (Microsoft Visual Studio Express 15), ситуация такая же.
т.е. перехожу для теста на другой ПК (WinXP/SP3) и приложение выдает ошибку, что неправильный вызов внешней функции и закрывается.
Код: 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.
...
// Загружаем модуль
std::unique_ptr<HINSTANCE__, decltype(&::FreeLibrary)> mHandle(
	::LoadLibraryEx(L"C:\\TESTAPP\\CiFbEnc_x86.dll",0,LOAD_WITH_ALTERED_SEARCH_PATH),
	&::FreeLibrary);

if (!mHandle)
{
	MessageBox(
		NULL,
		L"Модуль CiFbEnc_x86.dll не найден или рядом с ним нет fbclient.dll",
		L"Загрузка модуля",
		MB_OK|MB_ICONERROR);

	return;
}
// Получаем активатор
//typedef CALL_CONV int(__stdcall *CREATEFUNCPTR)(CI::ICiFbEncActivator**);

/*
* убрал CALL_CONV, т.к. иначе не компилирует.
* Может в этом причина?
* Но далее то проходит...
*/

typedef int(__stdcall *CREATEFUNCPTR)(CI::ICiFbEncActivator**);

CREATEFUNCPTR GetActivator = (CREATEFUNCPTR)::GetProcAddress(mHandle.get(), "createCiFBEncActivator");

if (!GetActivator)
{
	MessageBox(
		NULL,
		L"Не удалось получить из модуля CiFbEnc_x86.dll процедуру" 
              "createCiFBEncActivator"
		 " - попробуйте посмотреть, что пишет tdump.",
		L"Загрузка модуля",
		MB_OK|MB_ICONERROR);

	return;
}

/* доходит до сюда в WinXP и выдает ошибку (R0000) в 1-ом случае и (R0015) во 2-ом */

CI::ICiFbEncActivator* pActivator = NULL;
GetActivator(&pActivator);
if (!pActivator) { ShowMessage("ERROR GetActivator!"); return; } // сюда не доходит
...


Добавлял уже для WinXP и:
Код: plaintext
1.
#define WINVER 0x501


и устанавливал:
Код: plaintext
1.
Platform Toolset = Visual Studio 2015 - Windows XP (v140_xp)


Все равно программа доходит до той же точки на ПК, где WinXP, и падает :(

Где ошибка? В общем, как побороть этот пример для WinXP? ( исходники примера )
...
Рейтинг: 0 / 0
Как вызвать функцию в DLL
    #39681286
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AIS,

Скорее всего не хватает рантайма VS - msvcrtXXX.dll и зависимости.
Его начиная с VS2005 надо устанавливать (или копировать .dll из него) вместе с откомпилированной в студии программой.
Подробности не помню.
...
Рейтинг: 0 / 0
Как вызвать функцию в DLL
    #39681409
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky,

с одной стороны, тоже так думал и думаю, но с другой, созданные в 1-ом случае dll и во 2-ом pbx в целом работают.
Делал сборку с ключом /MD, но не помогает. Может этого не достаточно и надо ещё что то настроить в свойствах проекта?

ПС. А вообще программа запускается на WinXP, все созданные функции в двух вариантах работают, ПО не падает и ошибок не выдает. А вот при обращении к классу и виртуальным функциям из сторонней dll программа на WinXP падает, но не сразу, а на каком то этапе.
...
Рейтинг: 0 / 0
Как вызвать функцию в DLL
    #39681483
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Да, забыл ещё отметить, что ранее собирал программки на РВ10.5 (W7/64) и они работали в т.ч. и на WinXP, где в каталоге программы была msvcr 71 .dll, а уже эта тестовая программка запросила msvcr 100 .dll. Конечно заменил и программа заработала частично, но старые программы так же и работают со старой msvcr 71 .dll на тестируемом ПК.
От чего так? Может от того, что на рабочем ПК установил "Microsoft Visual Studio Express 15" и теперь появилась такая проблема с WinXP?
Одним словом, почему программа на РВ10.5 не довольствуется теперь своей стандартной msvcr 71 .dll, а требует другую msvcr 100 .dll?
...
Рейтинг: 0 / 0
Как вызвать функцию в DLL
    #39683824
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
У DLL, к которой подключаюсь динамически, если я правильно понял, оказывается стоят параметры сборки:
Required OS version 6.00
Subsystem version 6.00
т.е. на WinXP её экспортируемые функции работать не будут.
Наверное это и есть причина, что на определенном этапе после загрузки dll и вызове экспортируемой функции программа на WinXP падает, я правильно понимаю?

Какое то решение есть для такой ситуации?
...
Рейтинг: 0 / 0
Как вызвать функцию в DLL
    #39684197
Dim2000
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
06.08.2018 16:38, AIS пишет:

> Какое то решение есть для такой ситуации?

Наконец-то забить на XP. Вполне разумно в 2018 году.
Posted via ActualForum NNTP Server 1.5
...
Рейтинг: 0 / 0
Как вызвать функцию в DLL
    #39684380
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
AISКакое то решение есть для такой ситуации?
Собирать dll в более старом компиляторе который поддерживет xp.
...
Рейтинг: 0 / 0
Как вызвать функцию в DLL
    #39684381
AIS
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dim2000Наконец-то забить на XP. Вполне разумно в 2018 году.

Я бы с удовольствием, но надо и ХР.
А имея lib-файл исходной dll, получится скомпилировать новую dll под ХР?
...
Рейтинг: 0 / 0
25 сообщений из 29, страница 1 из 2
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Как вызвать функцию в DLL
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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