Экспертная система Delphi.int.ru

Сообщество программистов
Общение, помощь, обмен опытом

Логин:
Пароль:
Регистрация | Забыли пароль?

Delphi.int.ru Expert

Другие разделы портала

Переход к вопросу:

#   

Статистика за сегодня:  


Лучшие эксперты

Подробнее »



Вопрос # 2 158

/ вопрос открыт /

Здравствуйте! Уважаемые эксперты, просьба не кидаться помидорами за глупый вопрос
Не могу никак понять, что мне надо написать в коде приложения чтобы вызвать длл из приложения? Думаю, что и длл у меня написана неправильно...
я только учусь (
Первые две длл-ки выходят, а третья не хочет

Приложение:
  1.  
  2. library Thirddll;
  3.  
  4. uses
  5. ShareMem,
  6. SysUtils,
  7. Dialogs;
  8.  
  9. type
  10. TBase = 2..36;
  11.  
  12. function tripleqw (n: Integer): string; stdcall; overload;
  13. const
  14. cSymbols : array [0..35] of char = '0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ';
  15. var
  16. bDigit : byte;
  17. base : TBase;
  18.  
  19. begin
  20. ShowMessage ('Fourth function called');
  21. if n = 0 then
  22. Result := '0'
  23. else
  24. Result := '';
  25. while n > 0 do
  26. begin
  27. bDigit := n mod base;
  28. n := n div base;
  29. Result := cSymbols[bDigit] + result;
  30. end;
  31.  
  32. end;
  33.  
  34. exports
  35. tripleqw (n: Integer);
  36. end.
  37.  
  38.  
  39. function Triple (N: Integer): Integer; stdcall; external 'FIRSTDLL.DLL';
  40. function Tripleq (N: Integer): Integer; stdcall; external 'SECONDDLL.DLL';
  41. function Tripleqw (N: Integer): string; stdcall; external 'thirdDLL.DLL';
  42.  
  43. var
  44. TestDLL: TTestDLL;
  45.  
  46. implementation
  47.  
  48. {$R *.dfm}
  49.  
  50. procedure TTestDLL.Button1Click(Sender: TObject);
  51. begin
  52. EditOut.Text:= IntToStr(triple(StrToInt(EditIn.Text)));
  53. end;
  54.  
  55. procedure TTestDLL.Button2Click(Sender: TObject);
  56. begin
  57. EditOut.Text:= IntToStr(tripleq(StrToInt(EditIn.Text)));
  58. end;
  59.  
  60. procedure TTestDLL.Button3Click(Sender: TObject);
  61. begin
  62. EditOut.Text:=tripleqw(StrToInt(EditIn.Text));
  63. end;
  64.  


Точка Вопрос ожидает решения (принимаются ответы, доступен мини-форум)

Вопрос задала: Точка (статус: Посетитель)
Вопрос отправлен: 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)), но её можно безобидно передавать в длл и обратно.
Галочка "подтверждения прочтения" - вселенское зло.

Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте.

Версия движка: 2.6+ (26.01.2011)
Текущее время: 22 февраля 2025, 11:36
Выполнено за 0.03 сек.