Главная страница
    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 символы удаляются?



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

Форум: "Начинающим";
Текущий архив: 2007.04.08;
Скачать: [xml.tar.bz2];

Наверх





Память: 0.54 MB
Время: 0.073 c
1-1171335655
Андрей Прокофьев
2007-02-13 06:00
2007.04.08
TMemo, TDBMemo


2-1174151568
vegarulez
2007-03-17 20:12
2007.04.08
Как в TEdit разрешить записаь только цифр?


2-1174432039
koha
2007-03-21 02:07
2007.04.08
Function WinSvc.GetServiceDisplayName


2-1174118100
Boker
2007-03-17 10:55
2007.04.08
TImage - невозможна загрузка ...??


15-1173970258
zdm
2007-03-15 17:50
2007.04.08
MaskEdit





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
Английский Французский Немецкий Итальянский Португальский Русский Испанский