| 
| 
 | Вопрос # 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; beginShowMessage ('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; exportstripleqw (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);beginEditOut.Text:= IntToStr(triple(StrToInt(EditIn.Text)));end; procedure TTestDLL.Button2Click(Sender: TObject);beginEditOut.Text:= IntToStr(tripleq(StrToInt(EditIn.Text)));end; procedure TTestDLL.Button3Click(Sender: TObject);beginEditOut.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)), но её можно безобидно передавать в длл и обратно. Галочка "подтверждения прочтения" - вселенское зло. |  Чтобы оставлять сообщения в мини-форумах, Вы должны авторизироваться на сайте. |