Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2007.04.08;
Скачать: CL | DM;

Вниз

DLL   Найти похожие ветки 

 
ElectriC ©   (2007-03-20 02:02) [0]

Имеется Dll и, собственно, программа, к которой Dll подключается.
//----------------------------------------------
Код Dll:
...
function Res(i : byte) : PChar; stdcall;
begin
 case i of
   1 : Result := PChar(12345678901234567890);
   2 : Result := PChar(123456789012345678);
 end;
end;
...
exports
 Res;
begin
end.
//-----------------------------------------------
Программа имеет компонент Edit : TEdit.

Код программы:
...
public
 Res : function(i : byte) : PChar; stdcall;
...
Загрузка Dll и вызов функции;
...
Если Edit.Text := Res(1), то Edit.Text будет иметь вид: 12345678901234567890.
Если же Edit.Text := Res(2), то Edit.Text будет имет вид: 1234567890123456
+ добавляет пробел.
//-----------------------------------------------
Вопрос: Объяcните, пожалуйста, почему пропадает цифра 7 и 8, когда Edit.Text := Res(2)?


 
Германн ©   (2007-03-20 02:11) [1]


> Вопрос: Объяcните, пожалуйста, почему пропадает цифра 7
> и 8, когда Edit.Text := Res(2)?
>

"Пойди туда, не знаю куда. Найди то," и т.д.
Что программа столь "суперсекретна", что нельзя привести тут её фрагмент? Или боишься привести, чтобы не "уличили в ламерстве"? Если второе, то научись плевать на тех, кто "уличает"! Они сами "ламеры", причём гораздо более глупые :)


 
ElectriC ©   (2007-03-20 02:46) [2]


> Что программа столь "суперсекретна"

Причём тут это!
Основной текст программы, по которому у меня возникает вопрос, я привёл!
Причём тут "ламеры"?


 
Германн ©   (2007-03-20 03:06) [3]


> Причём тут это!
> Основной текст программы, по которому у меня возникает вопрос,
>  я привёл!
> Причём тут "ламеры"?



> Программа имеет компонент Edit : TEdit.
>
> Код программы:
> ...
> public
>  Res : function(i : byte) : PChar; stdcall;
> ...
> Загрузка Dll и вызов функции;
> ...
> Если Edit.Text := Res(1), то Edit.Text будет иметь вид:
> 12345678901234567890.
> Если же Edit.Text := Res(2), то Edit.Text будет имет вид:
>  1234567890123456
> + добавляет пробел.

Это ты считаешь, что привел текст программы?


 
ElectriC ©   (2007-03-20 03:08) [4]


> Это ты считаешь, что привел текст программы?

А что ещё надо? Основное уж написано!
Не буду ж я приводить весь текст программы, состоящий из 5000 строк.


 
ElectriC ©   (2007-03-20 03:10) [5]

Проблема в PChar?


 
Германн ©   (2007-03-20 03:32) [6]

А что ты имеешь в виду под:

> public
>  Res : function(i : byte) : PChar; stdcall;
?


 
ElectriC ©   (2007-03-20 03:43) [7]


> Res : function(i : byte) : PChar; stdcall;

Объявляю функцию, которую потом загружаю в свою программу из Dll
(
Handle : THandle - переменная в которую я загружаю свою Dll
HandleDll := LoadLibrary(PChar("Dll\MyDll.dll");
Res := GetProcAddress(HandleDll, "Res")
);


 
Германн ©   (2007-03-20 03:47) [8]


> ElectriC ©   (20.03.07 03:43) [7]
>
>
> > Res : function(i : byte) : PChar; stdcall;
>
> Объявляю функцию, которую потом загружаю в свою программу
> из Dll

В секции public некоего компонента???


 
ElectriC ©   (2007-03-20 03:51) [9]


> В секции public некоего компонента???

Нет! Только переменые типа byte, string и прочее!


 
Германн ©   (2007-03-20 04:00) [10]

Ещё раз
Германн ©   (20.03.07 03:32) [6]
Особое внимание на термин "public"!


 
ElectriC ©   (2007-03-20 04:02) [11]


> Особое внимание на термин "public"!

В каком смысле, "особое внимание"?


 
ElectriC ©   (2007-03-20 04:10) [12]

Можешь написать, как правильно сделать?


 
Германн ©   (2007-03-20 04:13) [13]


> ElectriC ©   (20.03.07 04:02) [11]
>
>
> > Особое внимание на термин "public"!
>
> В каком смысле, "особое внимание"?
>

Если объявление функции Res идёт сразу после зарезервированного слова public, то ...


 
ElectriC ©   (2007-03-20 04:16) [14]


> то ...

То что?


 
ElectriC ©   (2007-03-20 04:17) [15]

Как, вообще, лучше сделать?


 
Германн ©   (2007-03-20 04:17) [16]


> ElectriC ©   (20.03.07 04:10) [12]
>
> Можешь написать, как правильно сделать?
>

Наверно могу. Но ты тут напустил такую дымовую завесу! :)


 
ElectriC ©   (2007-03-20 04:18) [17]


> Наверно могу. Но ты тут напустил такую дымовую завесу! :
> )

please, напиши!


 
SlymRO ©   (2007-03-20 04:24) [18]

http://delphimaster.net/view/2-1173033268/


 
ElectriC ©   (2007-03-20 04:29) [19]


> SlymRO ©   (20.03.07 04:24) [18]
> http://delphimaster.net/view/2-1173033268/

Ща почитаем!


 
Германн ©   (2007-03-20 04:37) [20]


> ElectriC ©   (20.03.07 04:18) [17]
>
>
> > Наверно могу. Но ты тут напустил такую дымовую завесу!
>  :
> > )
>
> please, напиши!
>

impementation
Res : function(i : byte) : PChar; stdcall; external "YourDll"


 
ElectriC ©   (2007-03-20 04:40) [21]


> Res : function(i : byte) : PChar; stdcall; external "YourDll"

Проверим!


 
Германн ©   (2007-03-20 04:40) [22]


> Германн ©   (20.03.07 04:37) [20]

За очепятки не судить! Сами такие! :)


 
Германн ©   (2007-03-20 04:43) [23]


> ElectriC ©   (20.03.07 04:40) [21]
>
>
> > Res : function(i : byte) : PChar; stdcall; external "YourDll"
>
> Проверим!
>

Эее. Ты проверяй, но и думай при этом!  :)


 
SlymRO ©   (2007-03-20 04:44) [24]

Германн ©   (20.03.07 4:40) [22]
stdcall;

Ну зачем... Ему ведь еще всеравно регистры/стек...
[21]ElectriC
Прочел [18]? Что еще не понял?


 
Novice   (2007-03-20 07:30) [25]

Дабы не плодить идентичные темы, задам здесь свой вопрос по DLL:
Я использую в своей программе некую собственноручно написанную DLL. В этой DLL идет работа со строками, поэтому я и в самой DLL-ке, и в программе, использующей эту DLL, подключаю модуль ShareMem. DLL подключается статически - через заголовочный файл. Директивы наподобие stdcall, resident и т.д. не использую.
И вот такая ситуация:
В программе в секции USES подключаю юнит ShareMem. Заголовочный файл для DLL не включаю в секцию, т.е. DLL даже не грузится в память. В программе вызовов функций из DLL нет. Запускаю программу, нажимаю кнопку "X" - закрыть окно, и вылетает ошибка AccessViolation. Стоит отключить Sharemem, ошибка исчезает. В чем дело? В моих кривых руках? В кривом менеджере памяти?


 
Novice   (2007-03-20 07:34) [26]

Прошу прощения, ошибка Invalid Pointer Operation.


 
Loginov Dmitry ©   (2007-03-20 07:37) [27]

> В чем дело? В моих кривых руках?


Видимо, в них.

Подключай модуль ShareMem самым первым модулем программы. Это нужно делать в файле проекта *.dpr


 
Loginov Dmitry ©   (2007-03-20 07:41) [28]

> function Res(i : byte) : PChar; stdcall;
> begin
> case i of
>   1 : Result := PChar(12345678901234567890);
>   2 : Result := PChar(123456789012345678);
> end;
> end;


Что за извращение? Этож даже не скомпилится!


function Res(i : byte) : PChar; stdcall;
begin
case i of
  1 : Result := PChar(123456);
  2 : Result := PChar(1234567);
end;
end;


Вот так должно скомпилится. Однако непонятно, зачем функция возвращает PChar, а не Integer? И какой нужна такая функция вообще, и тем более в DLL?


 
Novice   (2007-03-20 07:47) [29]

>>Видимо, в них.
Ваша правда, уважаемый Loginov Dmitry :-)

>>Подключай модуль ShareMem самым первым модулем программы. Это нужно
>>делать в файле проекта *.dpr
Благодарю за помощь, теперь все в норме!


 
Kedge ©   (2007-03-20 08:20) [30]

> [28] Loginov Dmitry ©   (20.03.07 07:41)
> > function Res(i : byte) : PChar; stdcall;
> > begin
> > case i of
> >   1 : Result := PChar(12345678901234567890);
> >   2 : Result := PChar(123456789012345678);
> > end;
> > end;
>
>
> Что за извращение? Этож даже не скомпилится!
>
> function Res(i : byte) : PChar; stdcall;
> begin
> case i of
>  1 : Result := PChar(123456);
>  2 : Result := PChar(1234567);
> end;
> end;


Не могу найти отличий (ни десяти, ни одного) :)


 
Сергей М. ©   (2007-03-20 08:24) [31]


> Kedge ©   (20.03.07 08:20) [30]


> Не могу найти отличий (ни десяти, ни одного) :)


Печальный факт)


 
Kedge ©   (2007-03-20 08:35) [32]

> [31] Сергей М. ©   (20.03.07 08:24)
Объясните, в чем разница ?
P.S.
У меня компиляться и тот и "другой".


 
Сергей М. ©   (2007-03-20 08:41) [33]


> Kedge ©   (20.03.07 08:35) [32]


В D7 компиляция строки

1 : Result := PChar(12345678901234567890);

обязательно приведет к ошибке "Integer constsnt too large" !

Так что утверждение "У меня компиляться и тот и "другой" не соответствует действительности.


 
Kedge ©   (2007-03-20 08:42) [34]

BDS 2006 - компилится.


 
Сергей М. ©   (2007-03-20 08:48) [35]


> BDS 2006 - компилится.


Вот и ищи отличия Д7 от BDS 2006)


 
Kedge ©   (2007-03-20 08:51) [36]

> [35] Сергей М. ©   (20.03.07 08:48)
>Вот и ищи отличия Д7 от BDS 2006)
Поясни, в чем могут быть отличия ? Не в "размере" же integer.


 
Сергей М. ©   (2007-03-20 08:58) [37]


> Kedge ©   (20.03.07 08:51) [36]


Очевидно, BDS поддерживает объявление/использование 64-разрядных ц/ч констант.


 
Kedge ©   (2007-03-20 09:02) [38]

> [37] Сергей М. ©   (20.03.07 08:58)
Спасибо.


 
SlymRO ©   (2007-03-20 10:27) [39]

Вот-вот... конвертация тебя и сгубила... еслиб сразу ей стринг подсунул, может ошибку бы и не увидел...


 
ElectriC ©   (2007-03-20 12:45) [40]

Так причина в том, что строки содержащие от 1 до 16 символом в Edit.Text
отображаются нормально, но когда строка содержит от 1 до 17, 18, 19 символов, то эти же символы удаляются и вместо них пишется строка, равная 16 символам, а 17, 18, 19 удаляются. Но строка от 1 до 20, 21... символов отображается нормально! Так в чём же дело? Почему именно 17, 18, 19 символы удаляются?


 
Сергей М. ©   (2007-03-20 12:54) [41]


> ElectriC ©   (20.03.07 12:45) [40]


123456789012345678 - это не строка, это число.

Строка - это "123456789012345678"

Разницу осюсяешь ?


 
ElectriC ©   (2007-03-20 13:04) [42]


> Разницу осюсяешь ?

Так, всё равно, с любой строкой происходит такая причина

> что строки содержащие от 1 до 16 символом
> в Edit.Textотображаются нормально, но когда строка содержит
> от 1 до 17, 18, 19 символов, то эти же символы удаляются
> и вместо них пишется строка, равная 16 символам, а 17, 18,
>  19 удаляются. Но строка от 1 до 20, 21... символов отображается
> нормально! Так в чём же дело? Почему именно 17, 18, 19 символы
> удаляются?

А строку с числом я привёл ради наглядного примера, чтоли!


 
Сергей М. ©   (2007-03-20 13:25) [43]


> ElectriC ©   (20.03.07 13:04) [42]


> Так, всё равно, с любой строкой происходит такая причина


Ты на вопрос не ответил) ..


> строку с числом я привёл ради наглядного примера


Никаких "строк с числом" ты не приводил, ты привел число, а не строку с чем-то там)


 
ElectriC ©   (2007-03-20 13:40) [44]


> Ты на вопрос не ответил) ..
> Никаких "строк с числом" ты не приводил, ты привел число, а не строку с чем-то там)

Да причём тут это?
Объясни, почему возникает данная причина(уже какой раз пишу)

> что строки содержащие от 1 до 16 символом в Edit.Textотображаются
> нормально, но когда строка содержит от 1 до 17, 18, 19 символов,
>  то эти же символы удаляются и вместо них пишется строка,
>  равная 16 символам, а 17, 18, 19 удаляются. Но строка от
> 1 до 20, 21... символов отображается нормально! Так в чём
> же дело? Почему именно 17, 18, 19 символы удаляются?

А ты пишешь, что я "на вопрос не ответил"! Причём тут это!


 
Сергей М. ©   (2007-03-20 13:44) [45]


> ElectriC ©   (20.03.07 13:40) [44]


Ты русский язык вообще понимаешь ?)

Тебе был задан вопрос - ЧЕМ, по-твоему, отличается

PChar(123456789012345678)

от

PChar("123456789012345678")

Соблаговоли уж ответить на него, прежде чем рассуждать о превратностях судьбы)


 
ElectriC ©   (2007-03-20 13:58) [46]


> Тебе был задан вопрос - ЧЕМ, по-твоему, отличается
PChar(123456789012345678) - число
от
PChar("123456789012345678") - строка

Ты сам на него ответил))(см. Выше):)))


 
Сергей М. ©   (2007-03-20 14:02) [47]


> ElectriC ©   (20.03.07 13:58) [46]


Ну так и какого же хрена ты возвращаешь число, а не строку, коль речь ведешь именно о строках ?


 
ElectriC ©   (2007-03-20 14:05) [48]


> Ну так и какого же хрена ты возвращаешь число, а не строку,
>  коль речь ведешь именно о строках ?

Так я и возвращаю строку в своей программе, но происходит та же причина,
описанная выше!!!!


 
Сергей М. ©   (2007-03-20 14:13) [49]


> ElectriC ©   (20.03.07 14:05) [48]


Нет ну ты, ей-богу, придурок) ..


> происходит та же причина


Галиматьища несусветная)

Причина не может "происходить", происходит что-то по такой-то причине ! Т.е., то что произошло является следствием, имеющим некую причину, а не причиной !)


> возвращаю строку в своей программе


У тебя ДВЕ программы !
Одна - ЕХЕ, другая -DLL.
DLL возвращает что-то, а EXE принимает возвращаемое.

Так вот DLL у тебя возвращает число, а EXE с какого-то перепугу интерпретирует то, что она приняла из DLL, как строку.

Дурь ведь !


 
ElectriC ©   (2007-03-20 14:15) [50]


> Так вот DLL у тебя возвращает число

Dll у меня возвращает строку, а не ЧИСЛО!
P.S.

По себе не судят!


 
Сергей М. ©   (2007-03-20 14:18) [51]


> ElectriC ©   (20.03.07 14:15) [50]


> Dll у меня возвращает строку, а не ЧИСЛО!


Врешь, причем нагло)

Result := PChar(12345678901234567890); //так ты возвращаешь именно число

Result := PChar("12345678901234567890"); //а вот так ты возвратил бы именно строку

Ну детский сад прямо ! "Найди отличия" ..)..


 
ElectriC ©   (2007-03-20 17:16) [52]


> Result := PChar("12345678901234567890");

Дак так я и возвращаю строку, просто в описании ошибки я не поставил "12345....". Моя ошибка, признаю!
Всё равно, если так возвращаешь строку то

> что строки содержащие от 1 до 16 символом в Edit.Text отображаются
> нормально, но когда строка содержит от 1 до 17, 18, 19
> символов,  то эти же символы удаляются и вместо них пишется
> строка,  равная 16 символам, а 17, 18, 19 удаляются. Но
> строка от  1 до 20, 21... символов отображается нормально!
>  Так в чём  же дело? Почему именно 17, 18, 19 символы удаляются?


 
Loginov Dmitry ©   (2007-03-20 17:38) [53]

[D7]: Все работает так, как и должно.

Код DLL


library ProjDll;

function Res(i : byte) : PChar; stdcall;
begin
case i of
  1 : Result := PChar("12345678901234567890");
  2 : Result := PChar("123456789012345678");
else
  Result := nil;
end;
end;

exports
 Res;

begin
end.


Код ЕХЕ


unit Unit_Exe;

interface

uses
 Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms,
 Dialogs, StdCtrls;

type
 TForm1 = class(TForm)
   Button1: TButton;
   Button2: TButton;
   procedure Button1Click(Sender: TObject);
 private
   { Private declarations }
 public
   { Public declarations }
 end;

function Res(i : byte) : PChar; stdcall; external "ProjDll.dll";

var
 Form1: TForm1;

implementation

{$R *.dfm}

procedure TForm1.Button1Click(Sender: TObject);
begin
 Caption := Res(TButton(Sender).Tag); // У кнопок тэги равны 1 и 2 соответственно
end;

end.


Проверь (только без искажений). Должно работать.


 
ElectriC ©   (2007-03-20 17:58) [54]


> Проверь (только без искажений). Должно работать.

Ща проверим!



Страницы: 1 2 вся ветка

Текущий архив: 2007.04.08;
Скачать: CL | DM;

Наверх




Память: 0.61 MB
Время: 0.032 c
15-1173971063
alx2000
2007-03-15 18:04
2007.04.08
Предложение к администраторам форума.


15-1173995176
Иксик
2007-03-16 00:46
2007.04.08
Кириллическая SMS-ка


3-1169109557
GrBob
2007-01-18 11:39
2007.04.08
Упраление соединениями на MS SQL Server


15-1173792956
xayam
2007-03-13 16:35
2007.04.08
Вышла новая версия программы DelphiTo v0.25


2-1174054885
Serg777
2007-03-16 17:21
2007.04.08
БД и Stringgrid