Форум программистов, компьютерный форум, киберфорум
Наши страницы
Delphi для начинающих
Войти
Регистрация
Восстановить пароль
 
Zombosss
0 / 0 / 0
Регистрация: 18.11.2016
Сообщений: 7
1

Указатели и dll

18.11.2016, 17:24. Просмотров 259. Ответов 11
Метки нет (Все метки)

Это тупой вопрос, я знаю и мне стыдно...
У меня есть dll и пример на C++, а вызвать мне её надо из проекта дельфи. Но с дельфи я знаком слабо,
так что даже не знаю, неправильно я вызываю длл или накосячил с указателями.
Функция должна выглядеть так на C++
C
1
typedefint (__stdcall *GetInfo)(char * token, char ** login, char ** pass);
Тобишь я туда отправляю строку с токеном, а обратно должен получить логин/пароль.

В дельфи я пишу
Delphi
1
2
3
4
5
6
7
8
9
10
function getInfo(token : string;  nick,  pass : Pointer):integer; external 'Lib.dll';
...
procedure foo;
var
  token : string;
  nick,  pass : array[0..100] of char;
begin
  token := '123';
  getInfo(token, @nick,  @pass);
end;
В ответ получаю ошибку записи в память 00000030

Добавлено через 13 часов 40 минут
вызов на с++ выглядел так
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int main(intargc, char* argv[])
{
...
        getInfoPtr = (GetInfo)GetProcAddress(dllHandle, "getInfo");
        if (runTimeLinkSuccess = (NULL != getInfoPtr))
        {
            char* token = ""; // <== token goes HERE
 
            char* login = newchar[100];
            char* pass = newchar[100];
 
            intretVal = getInfoPtr(token, &login, &pass);
        }
 
 
        //Free the library:
        freeResult = FreeLibrary(dllHandle);
    }
}
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
18.11.2016, 17:24
Ответы с готовыми решениями:

Указатели в DLL
Здравствуйте! Помогите, пожалуйста, разобраться с указателями! Есть две...

Как указатели из библиотеки dll на с++ использовать в delphi
Добрый день. Вопрос состоит в следующем, у меня есть библиотека на c++, из...

Пытаюсь сделать динамическую загрузку dll. Dll-библиотека не подает признаков жизни
Здравствуйте. У меня такое дело, я пытаюсь создать в своей программе...

Как подключить dll, написанную на C, к dll на Delphi
Добрый день! Нужно подключить dll написанную на C к dll на Delphi. Как это...

Подключение библиотек libeay32.dll и ssleay32.dll
В общем написал програмку для отправки сообщений, но она не работает без 2х...

11
quwy
Native x86
3338 / 2184 / 650
Регистрация: 13.02.2013
Сообщений: 7,239
18.11.2016, 18:44 2
1. Делфовый тип string -- это совсем не то же самое, что char *. Это втуренний тип, который в C/C++ реализации не имеет и можно сказать, что не может. Все char * нужно объявлять как PAnsiChar для ANSI-строк и PWideChar для UTF-16.
2. Тип char ** является указателем на указатель, в Delphi это принято объявлять как var-параметр.
3. Конвенция вызова с плюсах вряд ли совпадает с делфовой, там либо cdecl, либо stdcall.

Результат будет примерно таким:
Delphi
1
function getInfo(token: PAnsiChar; var nick, pass: PAnsiChar): integer; stdcall; external 'Lib.dll';
Добавлено через 8 минут
P.S. А вообще у вас как-то странно исходные данные выглядят. Зачем в функцию передаются указатели на указатели? Обычно так делают, если функция сама выделяет память под выходные параметры, но у вас выделение делается перед вызовом...
0
Zombosss
0 / 0 / 0
Регистрация: 18.11.2016
Сообщений: 7
18.11.2016, 20:29  [ТС] 3
А как тогда должны выглядеть переменные, которые я туда должен отправить?
0
quwy
Native x86
3338 / 2184 / 650
Регистрация: 13.02.2013
Сообщений: 7,239
18.11.2016, 22:00 4
Просто переменные типа PAnsiChar.
0
Zombosss
0 / 0 / 0
Регистрация: 18.11.2016
Сообщений: 7
19.11.2016, 05:28  [ТС] 5
Так?
Delphi
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
function getInfo(token: PAnsiChar; var pass, login: 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);
 
  getIdcInfo(PAnsiChar(token), login, pass);
 
end;
дллка ругается на размер выделенной памяти для переменных. Раньше просто крашилась.

Добавлено через 1 час 30 минут
Дали пример на VB
Visual Basic
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
ImportsSystem.Runtime.InteropServices
 
PublicClassForm1
<DllImport("C:\Lib\Lib.dll", CallingConvention:=CallingConvention.StdCall)> _
PrivateSharedFunctiongetInfo(ByVal token AsString, ByRef login AsString, ByRef pass AsString) AsIntPtr
EndFunction
 
PrivateSub Form1_Load(sender AsObject, e AsEventArgs) HandlesMyBase.Load
  Dim token AsString = "0a37b2ce545061f4689a0ab839047ba2"
  Dim login AsString
  Dim pass AsString
  Dim result AsInteger 
 
  'Reserve memory for the strings passed by reference
  login = NewString(" ", 256)
  pass = NewString(" ", 100)
  result = getInfo(token, login, pass)
 EndSub
EndClass
Добавлено через 4 часа 49 минут
Что ни пишу в дельфи - всё время длл возвращает код ошибки с недостаточным выделением памяти.
Сбилдил пример на C++ - работает. Значит дллка работает правильно. Что-то не то получилось с указателями в дельфи.
0
wendstor
133 / 133 / 64
Регистрация: 15.05.2012
Сообщений: 502
19.11.2016, 11:51 6
C++
1
typedefint (__stdcall *GetInfo)(char * token, char ** login, char ** pass);
Во первых что за "слитный" typedefint? В С++ его не существует)). Должно быть так
C++
1
typedef int (__stdcall *GetInfo)(char * token, char ** login, char ** pass);
На Delphi
Delphi
1
function GetInfo(token: Pchar; var login: PChar; var pass: Pchar): Integer; stdcall;
Добавлено через 23 минуты
Да даже при правильном решении если функция не extern "C" она может не вызвотся, из-за декорировании имён функций С++
0
Zombosss
0 / 0 / 0
Регистрация: 18.11.2016
Сообщений: 7
19.11.2016, 16:37  [ТС] 7
Да, с пробелами в примере накосячили. Но в остальном там правильно.
Функция из дельфи вызывается, т.к. возвращает код ошибки. Правда, странное дело - она этот код возвращает, даже если выбросить из объявления половину параметров.
0
Zombosss
0 / 0 / 0
Регистрация: 18.11.2016
Сообщений: 7
24.11.2016, 02:01  [ТС] 8
Вопрос всё ещё актуален

Я пробовал использовать объявление в таком виде
Delphi
1
2
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
0
northener
пофигист широкого профиля
3423 / 2323 / 630
Регистрация: 15.07.2013
Сообщений: 13,746
24.11.2016, 02:04 9
Ну а отладчиком вы не пробовали воспользоваться?
0
Zombosss
0 / 0 / 0
Регистрация: 18.11.2016
Сообщений: 7
24.11.2016, 02:18  [ТС] 10
Что вы имеете ввиду? Чем он поможет? Конечно, я смотрю на это через отладчик. Но ничего полезного, кроме кода ответа, я через него не вижу.
0
northener
пофигист широкого профиля
3423 / 2323 / 630
Регистрация: 15.07.2013
Сообщений: 13,746
24.11.2016, 02:40 11
Цитата Сообщение от Zombosss Посмотреть сообщение
Чем он поможет? Конечно, я смотрю на это через отладчик. Но ничего полезного,
Гляжу в книгу - вижу фигу.
А я не знаю чем вам помочь, если вам отладчик ни чем не помогает.
0
Zombosss
0 / 0 / 0
Регистрация: 18.11.2016
Сообщений: 7
24.11.2016, 02:58  [ТС] 12
Чрезвычайно полезный комментарий. У вас был плохой день?
0
24.11.2016, 02:58
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.11.2016, 02:58

DLL и Динамическая загрузка DLL
Ребят, помогите, есть условие: Массив на 1000 элементов; Заполнение массива...

Указатели
Переведите пожалуста этот код на Delphi #include &quot;stdafx.h&quot; #include...

Указатели
Необходимо сделать массив указателей на множество функций. В строчке...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru