Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

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 файле


Наверх

Титульная страница Поиск, карта сайта Написать письмо