|
Вопрос # 2 158/ вопрос открыт / |
|
Здравствуйте! Уважаемые эксперты, просьба не кидаться помидорами за глупый вопрос
Не могу никак понять, что мне надо написать в коде приложения чтобы вызвать длл из приложения? Думаю, что и длл у меня написана неправильно...
я только учусь (
Первые две длл-ки выходят, а третья не хочет
Приложение: Переключить в обычный режим-
- library Thirddll;
-
- uses
- ShareMem,
- SysUtils,
- Dialogs;
-
- type
- TBase = 2..36;
-
- function tripleqw (n: Integer): string; stdcall; overload;
- const
- cSymbols : array [0..35] of char = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
- var
- bDigit : byte;
- base : TBase;
-
- begin
- ShowMessage ('Fourth function called');
- if n = 0 then
- Result := '0'
- else
- Result := '';
- while n > 0 do
- begin
- bDigit := n mod base;
- n := n div base;
- Result := cSymbols[bDigit] + result;
- end;
-
- end;
-
- exports
- tripleqw (n: Integer);
- end.
-
-
- function Triple (N: Integer): Integer; stdcall; external 'FIRSTDLL.DLL';
- function Tripleq (N: Integer): Integer; stdcall; external 'SECONDDLL.DLL';
- function Tripleqw (N: Integer): string; stdcall; external 'thirdDLL.DLL';
-
- var
- TestDLL: TTestDLL;
-
- implementation
-
- {$R *.dfm}
-
- procedure TTestDLL.Button1Click(Sender: TObject);
- begin
- EditOut.Text:= IntToStr(triple(StrToInt(EditIn.Text)));
- end;
-
- procedure TTestDLL.Button2Click(Sender: TObject);
- begin
- EditOut.Text:= IntToStr(tripleq(StrToInt(EditIn.Text)));
- end;
-
- procedure TTestDLL.Button3Click(Sender: TObject);
- begin
- EditOut.Text:=tripleqw(StrToInt(EditIn.Text));
- end;
-
 |
Вопрос задала: Точка (статус: Посетитель)
Вопрос отправлен: 5 декабря 2008, 05:17
Состояние вопроса: открыт, ответов: 1.
|
Ответ #1. Отвечает эксперт: min@y™
1. Мой тебе совет: никогда не используй передачу строк, дин. массивов и экземпляров классов для передачи данных между DLL и приложением! Даже с uses ShareMem. Это ведёт к раку мозгов. Для передачи строк юзай только PChar или PWideChar (для Unicode).
2. Посмотрел я твой код DLL. Понял, что функция tripleqw переводит целое число n в число системы счисления по основанию base.
bDigit := n mod base; // <--- base не инициализирована
n := n div base; // <--- base не инициализирована
Я переделал DLL так, что всё заработало. Код DLL и тестового приложения прицепляю к ответу.
З.Ы. Мой ответ НЕ ЯВЛЯЕТСЯ наставлением, типа "как надо писать программы". Я просто показал, как делаю я. К ответу прикреплён файл. Загрузить » (срок хранения: 60 дней с момента отправки ответа)
 |
Ответ отправил: min@y™ (статус: Доктор наук)
Время отправки: 5 декабря 2008, 09:01
Оценка за ответ: 5
Комментарий к оценке: Спасибо большое
|
Мини-форум вопроса
Всего сообщений: 1; последнее сообщение — 5 декабря 2008, 11:04; участников в обсуждении: 1.
|
Вадим К (статус: Академик), 5 декабря 2008, 11:04 [#1]:
Можно спокойно юзать WideSting. Немножко вначале будет дивно (это всё таки юникодная строка, поэтому для неё sizeof(s) = 2*length(s)), но её можно безобидно передавать в длл и обратно.
Галочка "подтверждения прочтения" - вселенское зло.
|
Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.
|