Форум: "Начинающим";
Текущий архив: 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