Tworzę w DLL wątek, który odwołuje się do interfejsu głównej aplikacji:
Kod DLL:
var
OrderCount: string;
begin
OrderCount := '1';
TThread.CreateAnonymousThread(procedure
begin
while not TThread.CheckTerminated do
begin
// AAP - interfejs głównej aplikacji
if OrderCount = '' then
begin
AAP.UpdateNotifyBadgeButton('btnMobile', 'Lista zleceń mobilnych', '');
end
else
AAP.UpdateNotifyBadgeButton('btnMobile', 'Liczba nowych zleceń mobilnych: ' + OrderCount, OrderCount);
end;
end).Start;
Kod aplikacji głównej:
function TfrmMain.UpdateNotifyBadgeButton(AButtonName, AHint,
ABadgeValue: string): HRESULT;
var
LNotifyButton: TAdvBadgeSpeedButton;
begin
result := S_OK;
LNotifyButton := pnlNotifications.FindComponent(AButtonName) as TAdvBadgeSpeedButton;
if Assigned(LNotifyButton) then
begin
TThread.Synchronize(nil, procedure // próbowałem też bez tego - bez różnicy
begin
LNotifyButton.Hint := AHint; // tutaj za drugim razem Invalid Pointer (LNotifyButton jest przypisany)
LNotifyButton.Badge := ABadgeValue;
end);
end;
end;
A tutaj tworzenie 1 raz przycisku LNotifyButton, przy inicjowaniu DLL
function TfrmMain.AddNotifyBadgeButton(AButtonName, AHint, ABadgeValue: string; ABitmapHandle: THandle; AOnClickProc: TNotifyProc): HRESULT;
var
LMethod: TMethod;
i: Integer;
begin
result := S_OK;
LMethod.Data := nil;
LMethod.Code := @AOnClickProc;
LNotifyButton := TAdvBadgeSpeedButton.Create(pnlNotifications);
LNotifyButton.Parent := pnlNotifications;
LNotifyButton.Name := AButtonName;
LNotifyButton.ShowHint := AHint <> '';
LNotifyButton.Hint := AHint;
LNotifyButton.Align := alLeft;
LNotifyButton.Flat := True;
LNotifyButton.Width := 45;
LNotifyButton.Badge := ABadgeValue;
LNotifyButton.AlignWithMargins := True;
LNotifyButton.Margins.Top := 10;
LNotifyButton.Glyph.Handle := ABitmapHandle;
LNotifyButton.OnClick := TNotifyEvent(LMethod);
end;
Za pierwszym razem działa, a za drugim dostaje Invalid Pointer Operation. Jak kliknę Break w oknie wyjątku to wyrzuca mnie miejsca jak w załączniku.
Dodam, że dzieje się tak, jeżeli przekazuję dodatkowy sklejony string ze zmiennej, natomiast jeżeli idzie stała wartość określona w apostrofach, to działa. Coś się dzieje z pamięcią.
Podejrzewam, ze to przez to, że przekazuję STRING z DLL, a powinienem PAnsiChar. Czy ktoś jest w stanie pokazać na moim przykładzie jak miałoby to wyglądać - muszę alokować pamięć dla PAnsiChar i ją zwalniać, czy tutaj manager pamięci zrobi to za mnie?
Proszę o pomoc.
- break.png (26 KB) - ściągnięć: 158
- callstack.png (96 KB) - ściągnięć: 150
abrakadaber