Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Начинающим";
Текущий архив: 2007.04.08;
Скачать: [xml.tar.bz2];

Вниз

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;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.59 MB
Время: 0.091 c
3-1169113342
Castlevania
2007-01-18 12:42
2007.04.08
InterBase SQL и память


2-1174050233
Один
2007-03-16 16:03
2007.04.08
IB7.1 очень большой расход памяти сервером


2-1174239825
c0rben
2007-03-18 20:43
2007.04.08
Про canvas


2-1174295061
wasa
2007-03-19 12:04
2007.04.08
Поля


2-1173473079
Ezorcist
2007-03-09 23:44
2007.04.08
JPEG





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский