Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > Общие вопросы Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 24.11.2016, 01:57   #1
Zomboss
Новичок
Джуниор
 
Регистрация: 24.11.2016
Сообщений: 3
По умолчанию Передача ссылок на строку в DLL

Здравствуйте. Ковыряюсь с этим не первый день, но я с дельфи почти не работаю, так что нуждаюсь в помощи знатоков.
У меня есть dll и инструкции к ней на C++.
Мне нужно вызвать её из дельфи.
Код:
typedef int (__stdcall *GetInfo)(char * token, 
	char ** login, char ** pass);

int _tmain(int argc, _TCHAR* argv[])
{
	bool freeResult, runTimeLinkSuccess = false;
	HINSTANCE dllHandle = NULL;
	GetInfo getInfoPtr = NULL;

	//Load the dll and keep the handle to it
	dllHandle = ::LoadLibrary(L"c:\\Lib\\Lib.dll");

	// If the handle is valid, try to get the function address. 
	if (NULL != dllHandle)
	{

		getInfoPtr = (GetInfo)GetProcAddress(dllHandle, "getInfo");
		if (runTimeLinkSuccess = (NULL != getInfoPtr))
		{
			char* token = "676f5489269b215a7ce1c453bb41f1aa"; // <== token goes HERE

			char* login = new char[256];
			char* pass = new char[100];

			int retVal = getInfoPtr(token, &login, &pass);
			

			delete[] login;
			delete[] pass;
		}


		//Free the library:
		freeResult = FreeLibrary(dllHandle);
	}

	return 0;
}
Как видно, суть в том, что в функцию отправляется одна строка, а обратно по ссылке возвращается 2 другие. Память для этих строк выделяется до отправки.
В с++ код и библиотека работают (проверил).
В дельфи я пытаюсь писать так:
Код:
function getInfo(token: PAnsiChar; var nick, pass: PAnsiChar): integer; stdcall; external 'Lib.dll';

procedure TDialogLogin.OnShow;
var
  token : AnsiString;
  pass : PAnsiChar;
  login : PAnsiChar;
 
begin
  token := '123';
    GetMem(pass,100);
    GetMem(login,256);
 
  getInfo(PAnsiChar(token), login, pass);
 
end;
Длл реагирует, но возвращает код, говорящий, что выделено недостаточно памяти.
Я пробовал использовать объявление в таком виде
Код:
type PPAnsiChar = ^PAnsiChar;
function getInfo(token: PAnsiChar; login, pass: PPAnsiChar): integer; stdcall; external 'Lib.dll';
Результат тот же - код недостатка выделенной памяти. Я пробовал выделять не 256, а 2560000... и пока память не кончится - результат тот же.
Я пытался объявить массив вида pass : array[0..256] of AnsiChar и передать его как @pass или @pass[0] или Addr(pass) или Addr(pass[0]) - получаю эксепшен access violation
Итак, вопрос: ЧЯДНТ, как правильно объявить эту функцию, как правильно скормить ей указатели на строки и как для них правильно выделить память?

Последний раз редактировалось Zomboss; 24.11.2016 в 15:48.
Zomboss вне форума Ответить с цитированием
Старый 24.11.2016, 13:14   #2
kutani
Форумчанин
 
Регистрация: 23.01.2016
Сообщений: 608
По умолчанию

Код:
FillChar(login,256,0);
FillChar(pass,100,0);
getInfo(PAnsiChar(token), @login[0], @pass[0]);
kutani вне форума Ответить с цитированием
Старый 24.11.2016, 16:27   #3
Zomboss
Новичок
Джуниор
 
Регистрация: 24.11.2016
Сообщений: 3
По умолчанию

access violation к нулям
Zomboss вне форума Ответить с цитированием
Старый 24.11.2016, 17:57   #4
Zomboss
Новичок
Джуниор
 
Регистрация: 24.11.2016
Сообщений: 3
По умолчанию

О! А мысль-то была правильная. Что бы я там не выделял ей не хватало памяти, потому что размер памяти эта хрень определяла считая пробелы.
Нужно было заполнить строку пробелами.
Zomboss вне форума Ответить с цитированием
Старый 25.11.2016, 07:38   #5
kutani
Форумчанин
 
Регистрация: 23.01.2016
Сообщений: 608
По умолчанию

...пробелы, вряд-ли. Символы, тоже вряд-ли. Если у вас есть исходники самой либы или сама либа, я мог бы ее погонять и в студии и под Delphi и найти проблему.
kutani вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Передача параметра в командную строку VHomer Win Api 1 03.12.2015 11:22
Передача данных из поля в командную строку kwns Microsoft Office Access 1 23.06.2014 00:00
Передача структуры из программы на c# в dll на c++ и получение структуры из dll iukash Общие вопросы .NET 0 07.05.2013 16:03
Крах при закрытии приложения, кривой подсчет ссылок в плагинах, импортирующие интерфейс из общей статической dll WhiskasTM Общие вопросы Delphi 2 09.03.2013 13:06
Передача хэндла через командную строку MaTBeu Win Api 9 29.11.2008 15:30