Je suis assez nouveau à Delphi & devez coder un client SOAP. Importation du WSDL génère ce code (que je ne peux évidemment pas changer comme je l'ai évidemment de respecter le côté serveur)Delphi 7: Violation d'accès - TByteDynArray problème
DataPart = class;
Message = class;
eMessage = class;
eventType = (send, delete, etc);
DataPart = class(TRemotable)
private
FhasData: Boolean;
Fdata: TByteDynArray;
published
property hasData: Boolean read FhasData write FhasData;
property data: TByteDynArray read Fdata write Fdata;
end;
Message = class(TRemotable)
private
FMessageID: Int64;
Ftimestamp: TXSDateTime;
Fevent: eventType;
FmagicNumber: WideString;
FDataPart: DataPart;
published
property MessageID: Int64 read FMessageID write FMessageID;
property timestamp: TXSDateTime read Ftimestamp write Ftimestamp;
property event: eventType read Fevent write Fevent;
property magicNumber: WideString read FmagicNumber write FmagicNumber;
property DataPart: DataPart read FDataPart write FDataPart;
end;
eMessage = class(TRemotable)
private
FencryptedMessage: TByteDynArray;
Fdata: DataPart;
published
property encryptedMessage: TByteDynArray read FencryptedMessage write FencryptedMessage;
property data: DataPart read Fdata write Fdata;
end;
MyApplicationPortType = interface(IInvokable)
['{99767D33-6B4A-7547-4DAC-0608095CAC70}']
function sendMessage(const encryptedMessage: TByteDynArray; const data: DataPart): WideString; stdcall;
end;
Quelqu'un peut-il me coder un exemple des valeurs factices qui appellera sendMessage() et non la cause une violation d'accès? Je ne sais vraiment pas comment gérer TByteDynArray
[Modifier] tel que demandé, voici mon code, mais - disclaimer - je devais le pirater au sujet d'un lot (réduire) avant de poster, donc il ne peut pas compiler. Les deux parms à sendMessage() ne sont pas nuls
var theMessageArray: TByteDynArray;
theResult : WideString;
messageData : TByteDynArray;
i : Integer;
begin
theMessage.messageID := theMessage.messageID + 1;
theMessage.timestamp := TXSDateTime.Create();
theMessage.timestamp.AsDateTime := Now();
theMessage.event := delete;
theMessage.magicNumber := 'magiC# ' + IntToStr(theMessage.messageID);
SetLength(messageData, 1);
messageData[0] := 0;
theMessage.dataPart.hasData := True;
messageData := theMessage.dataPart.messageData;
SetLength(messageData, $1000 * dataSize);
for i := 0 to $1000 * dataSize - 1 do
messageData[i] := i and $FF;
theMessage.DataPart.messageData := messageData;
theMessageArray := TByteDynArray(theMessage);
theResult := (HTTPRIO1 as MyApplicationPortType).sendMessage(theMessageArray, theMessage.dataPart);
Ceci est juste une interface. Que faites-vous qui provoque une violation d'accès? –
+1 pour une bonne question. Il y a deux manières de résoudre ceci - montrez-vous mon code et figurez pourquoi cela ne fonctionne pas, ou quelqu'un publie du code qui fonctionne et je peux le comparer au mien.Ok, je vais poster mon code, mais la chose importante (je pense) est que les deux params sont non-nul à l'appel – Mawg
Vous êtes vraiment en train d'arracher les mâchoires de la victoire parce que vous avez utilisé TByteDynArray au lieu de seulement TBytes (qui est vraiment juste une chaîne). –