Witam.
Ponieważ nie udało mi się napisać pod delphi obsługi podpisu (eDeklaracje), więc napisałem taki programik pod C#.
Pomysł jest taki, że:
Aplikacja w delphi wywoła program w C# i poda ścieżkę do pliku XML , nazwę pliku docelowego, numer certyfikatu i inne takie, jako parametr.
Do tego miejsca jest OK.
Ale nie chcę zamykać aplikacji(C#) i uruchamiać jej 40 razy bo mam 40 plików do podpisania, więc wpadłem na pomysł że zrobię to komunikatami.
Z delphi wysyłam sobie komunikat:
const
WM_FileSign = WM_USER + 3131;
procedure TfrmDeklaracje.Button1Click(Sender: TObject);
var
Uchwyt : THandle;
begin
Uchwyt := FindWindow(nil, 'ePodpis(XML)2014');
if Uchwyt>0 then begin
ShowMessage('Wysyłam komunikat');
if SendMessage(Uchwyt,WM_FileSign, 0, longint(pchar('c:\aaa.xml c:\aaa.sign 1 y')) )= 1 then
ShowMessage('Komunikat przekazany!')
else
ShowMessage('Błąd. Komunikat nie został przekazany!');
end else begin
UruchomProgramCS;
ShowMessage('Uruchamiam');
end;
end;
i tu zaczyna się problem bo nie wiem, jak bo odebrać w C#, a dokładnie jak wyciągnąć z parametru lParam string z parametrami.
protected override void WndProc(ref Message m)
{
string res;
base.WndProc(ref m);
if (m.Msg==wm_FileSign) {
textBox1.Text = "Odebrano komunikat \"wm_FileSign\"";
byte[] buff = new byte[512];
unsafe
{
fixed (byte* pbuff = buff) m.LParam.ToPointer();
}
ASCIIEncoding ae = new ASCIIEncoding();
res = ae.GetString(buff);
textBox1.AppendText(res);
}
}
W google są przykłady odnośnie C# i odczytu bufora, ale albo ja ich nie rozumiem, albo to nie oto mi chodzi, bo oni w przykładach mają wskaźnik, a ja mam w LParam INT a nie pointer i nie wiem co mam z tym zrobić.
W C# niewiele qmam, bo próbuję coś robić dopiero od miesiąca więc proszę o wyrozumiałość.
Streszczenie problemu:
Mam aplikację w delphi która robi wszystko oprócz podpisywania dokumentów.
Dlatego do tego celu napisałem programik w C#.
Teraz muszę przekazać programowi w C# parametry do podpisu(nawy plików, id certyfikatu, ścieżkę itp).
Pierwszy pomysł był taki aby uruchomić program z parametrami i to zadziałało. Niestety przy podpisywaniu seryjnym jest to trochę nieeleganckie rozwiązanie.
Wpadł mi pomysł wykorzystania komunikatów, ale nie wiem jak do C# przekazać w komunikacie string.