Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Delphi: Общие вопросы > Добавление ресурса в dll


Автор: Volkogriz 20.7.2013, 11:39
Доброе время суток!
Помогите разобраться с добавлением ресурса в длл
Я пробую так:
Код

procedure ExportDataRes(Path, AName, AType: String; data: TFileStream); overload;
var
hFile: HWND;
Buf: array of Byte;
begin
hFile := BeginUpdateResource(PChar(Path), False);
try
if hFile = 0 then
begin
RaiseLastOSError;
end;
SetLength(Buf, Data.Size);
Data.Position := 0;
Data.Read(Buf[0], Data.Size);
if not UpdateResource(hFile, PChar(AType), PChar(AName),
0, @Buf[0], Data.Size) then RaiseLastOSError;
Finalize(Buf);
finally
EndUpdateResource(hFile, False);
end;
end;

Вызываю:
Код

var
j:integer;
s:String;
Data :TFileStream ;
begin
s:=Edit3.Text+Copy(Edit4.Text,1,1) +Copy(Edit5.Text,1,1);
for j:=1 to length(s) do
s[j]:=Translit(s[j])[1];
Memo1.Lines.SaveToFile('db\FormsOrders\'+s);
Data := TFileStream.Create('db\FormsOrders\'+s, fmOpenRead);
ExportDataRes(extractfilepath(Application.ExeName)+'db\FormsOrders\FormsOrders.dll','Order',Format('%.6d',[CheckListBox1.ItemIndex+1]), Data);
Data.Free;
DeleteFile(PChar('db\FormsOrders\'+s));

Но ресурс не добавляется а заменяет существующий!
Пробовал искать но нечего не нашёл ((
Подскажите пожалуйста как это сделать.  
Заранее благодарен!
С уважением,
Volkogriz!

Автор: MetalFan 22.7.2013, 11:44
Странно... вроде когда с этим ковырялся несколько лет назад, все работало норм... правда ресурс я к экзешнику добавлял...
ты уверен, что добавляемый ресурс еще не существует в файле?

Автор: Volkogriz 22.7.2013, 22:12
да уверен!
В CheckListBox=е 100 Пунктов выбираю Пункт 1 добавляю появляотся ресурс 000001 выбираю Пункт2 добовляю, ресурс 000001 затевается и появляется ресурс 000002  
ExportDataRes(extractfilepath(Application.ExeName)+'db\FormsOrders\FormsOrders.dll','Order',Format('%.6d',[CheckListBox1.ItemIndex+1]), Data);
Так что вот так (

Автор: MetalFan 23.7.2013, 12:13
Volkogriz, только что проверил под dxe4 все норм, добавляются ресурсы в dll-ку.
у тебя, кстати, похоже Type и Name местами перепутаны.
Переписал немного код функции:
Код

procedure ExportDataRes(const AFilename: string; AResType, AResName : PChar; AData: TBytes);
var
  hFile: NativeUInt;
begin
  if AData = nil then Exit;
  hFile := BeginUpdateResource(PChar(AFilename), False);
  if hFile = 0 then
    RaiseLastOSError;
  try
    if not UpdateResource(hFile, AResType, AResName, 0, Pointer(AData), Length(AData)) then
      RaiseLastOSError;
  finally
    EndUpdateResource(hFile, False);
  end;
end;
Но, в приниципе, один фиг.


тестил так:
Код

var
  lB: TBytes;
begin
  lB := TEncoding.UTF8.GetBytes('teststring13123');
  ExportDataRes('d:\Temp\CompInstall.dll', 'mydata', 'testresource1', lB );
  lB := TEncoding.UTF8.GetBytes('teststring8787');
  ExportDataRes('d:\Temp\CompInstall.dll', 'mydata', 'testresource2', lB );
end;


Все норм, оба ресурса добавляются, ничего не затирается.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)