Гость
Форумы / PowerBuilder [игнор отключен] [закрыт для гостей] / Как вызвать функцию в DLL / 25 сообщений из 29, страница 1 из 2
10.12.2017, 17:37
    #39567325
AIS
AIS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вызвать функцию в DLL
Есть 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
11.12.2017, 12:09
    #39567588
AIS
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.
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
11.12.2017, 12:32
    #39567606
Dim2000
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вызвать функцию в DLL
10.12.2017 17:37, AIS пишет:

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

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

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

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

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

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

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

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

ЗЫ. AIS, пишите обертки на С++.
...
Рейтинг: 0 / 0
13.12.2017, 18:28
    #39569223
AIS
AIS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вызвать функцию в DLL
Anatoly Moskovsky,
я уже так и понял, что вариантов других нет.
...
Рейтинг: 0 / 0
03.02.2018, 23:46
    #39596236
AIS
AIS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вызвать функцию в DLL
Вроде сделал тестовую "обертку". Все работает, кроме вызова одной функции, у которой в параметрах структура. Выдает ошибку (-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
09.02.2018, 12:59
    #39599631
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вызвать функцию в DLL
AIS,

Среды ПБ у меня нет, так что написать из головы как должно быть не могу.
Приведите код который сейчас есть (выдающий ошибку).
Я подскажу что поправить (если увижу в чем проблема).
...
Рейтинг: 0 / 0
09.02.2018, 13:11
    #39599637
AIS
AIS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вызвать функцию в DLL
Ну, вот вроде, что нужно было имею в dll-обертке.
А как быть с подключением к БД в частности через Odbc?
Логичней было бы сразу в dll-обертке после установки ключа доступа к БД сразу и подключиться (сделал работает), но как тогда это подключение использовать в РВ не пойму?
С другой стороны после установки ключа не удалять его, а подключение сделать в РВ (тоже работает), но тогда ключ остается активированным до конца работы приложения, что как мне кажется небезопасно.
Может кто что посоветует или направит мысли в нужное русло, как правильней подключаться к БД?
...
Рейтинг: 0 / 0
01.03.2018, 17:44
    #39609261
AIS
AIS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вызвать функцию в DLL
Есть еще один вопрос.
Из РВ вызываю из 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
02.03.2018, 12:25
    #39609594
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вызвать функцию в DLL
AIS,

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

Вместо blob можно попробовать массив byte
...
Рейтинг: 0 / 0
02.03.2018, 12:54
    #39609610
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вызвать функцию в DLL
См также как создавать блоб из произвольных байтов - 2634026
...
Рейтинг: 0 / 0
24.03.2018, 00:56
    #39619884
AIS
AIS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вызвать функцию в DLL
Anatoly Moskovsky ,
спасибо за советы, помогло.
...
Рейтинг: 0 / 0
13.06.2018, 15:16
    #39660349
Richard18
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вызвать функцию в DLL
Совет стандартный - написать "обертку" на С++
...
Рейтинг: 0 / 0
29.07.2018, 15:47
    #39680694
AIS
AIS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вызвать функцию в DLL
Вроде уже собрал тестовую 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
30.07.2018, 20:38
    #39681286
Anatoly Moskovsky
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вызвать функцию в DLL
AIS,

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

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

ПС. А вообще программа запускается на WinXP, все созданные функции в двух вариантах работают, ПО не падает и ошибок не выдает. А вот при обращении к классу и виртуальным функциям из сторонней dll программа на WinXP падает, но не сразу, а на каком то этапе.
...
Рейтинг: 0 / 0
31.07.2018, 11:50
    #39681483
AIS
AIS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вызвать функцию в DLL
Да, забыл ещё отметить, что ранее собирал программки на РВ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
06.08.2018, 16:38
    #39683824
AIS
AIS
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Как вызвать функцию в DLL
У DLL, к которой подключаюсь динамически, если я правильно понял, оказывается стоят параметры сборки:
Required OS version 6.00
Subsystem version 6.00
т.е. на WinXP её экспортируемые функции работать не будут.
Наверное это и есть причина, что на определенном этапе после загрузки dll и вызове экспортируемой функции программа на WinXP падает, я правильно понимаю?

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

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

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

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


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