![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
DLL('cool')->dll:"parameter=nil"); [D7, XP]
savyhinst © (2007-12-22 19:50:00)Помогите пож.!
Уже целых несколько часов пытаюсь передать строку в ДЛЛ, исключений нет, но в ДЛЛ приходит ПУСТОТА!
Спасибо за внимание.
DiamondShark (2007-12-22 21:57:00) [1]
> Германн © (22.12.07 21:47) [11]
У тебя мания величия: ты в этой ветке меня совершенно не интересовал.
Германн (2007-12-22 21:47:00) [2]
> DiamondShark © (22.12.07 21:42) [10]
>
>
Ты на самом деле думаешь, что я буду с тобой в этой ветке спорить? Мне что больше делать нечего?
:)
DiamondShark (2007-12-22 21:42:00) [3]
> Германн © (22.12.07 20:34) [7]
>
> > myDir:=_myDir;
>
> Эта строчка подразумевает что _myDir т.н. zero-based array
> of char.
Эта строчка этого не подразумевает.
> А где ты в mpdllstr ставишь #0 я не вижу.
зеро-бэйзед, и зеро-терминатед -- это разные вещи.
Впрочем, второго эта строчка тоже не подразумевает.
> for i:=1 to length(tmpString) do tmpdllstr[i-1]:=tmpString[i];
Допустим, нам повезло, и length(tmpString)<128. Мусор в массиве оставить -- не смертельно.
Теперь вопрос повышенной сложности: как ты думаешь, что произойдёт, если length(tmpString) > 128?
> Германн © (22.12.07 21:05) [9]
> Рекомендую
StrPLCopy нынче не в моде?
Германн (2007-12-22 21:05:00) [4]Рекомендую перед заполнением массива символами строки заполнить массив нулями.
FillChar(tmpdllstr,SizeOf(tmpdllstr),#0);
for i:=1 to length(tmpString) do tmpdllstr[i-1]:=tmpString[i];
savyhinst (2007-12-22 20:37:00) [5]А как ставить?
Германн (2007-12-22 20:34:00) [6]
> myDir:=_myDir;
Эта строчка подразумевает что _myDir т.н. zero-based array of char. А где ты в mpdllstr ставишь #0 я не вижу.
savyhinst (2007-12-22 20:27:00) [7]
...
type dllstr=array[0..128] of char;
TSetDllIniProc=procedure(ininame:dllstr);
...
const cnst_setDllIniProcName='Effdll_setDllDirectory';
...
var
iniDllnameProc:TSetDllIniProc;
begin
...
libHandle:=LoadLibrary(PAnsiChar(str_libname));
if libHandle=0 then raise exception.Create('Can"t load effects library');
@iniDllnameProc:=GetProcAddress(libHandle,cnst_setDllIniProcName);
ShowMessage('iniFile.FileName='+iniFile.FileName);
tmpString:=iniFile.FileName;
for i:=1 to length(tmpString) do tmpdllstr[i-1]:=tmpString[i];
iniDllnameProc(tmpdllstr);
iniFile.Free;
end;
...
//dll::
...
var myDir:string;
...
procedure SetMyDir(_myDir:dllstr);
begin
myDir:=_myDir;
ShowMessage(myDir);
end;
...
exports
SetMyDir name 'Effdll_setDllDirectory';
Германн (2007-12-22 20:21:00) [8]Код хоть какой-нибудь привести можешь? Не надо на пальцах объяснять.
savyhinst (2007-12-22 20:16:00) [9]Да, и ещё везде ставил ;StdCall;
savyhinst (2007-12-22 20:12:00) [10]Сначала пробовал через PChar; потом писал
GetMem(Pstr,1024)
Передать(Pstr)
FreeMem(Pstr)
потом через WideString
и в конце, как я когда-то делал, через array[0..128]of char, что должно быть железно. Но ничего не помогает.
Германн (2007-12-22 20:08:00) [11]
> savyhinst © (22.12.07 19:50)
Пиши как передаешь. Телепаты по субботам отдыхают.
MetalFan (2007-12-22 20:05:00) [12]а почитать что-нибудь по теме религия не позволяет?
или хотя бы коментарии в dll project файле