Erro na Funcao WriteFile

Delphi

24/07/2006

Tenho um componente q peguei na net (Assync ) e usava no Delphi 3, qdo tentei compilar no Delphi 7 está dando um erro.

[b:429dc6e0c8]aki está a funcao:[/b:429dc6e0c8]

Private
FWriteOS: TOverlapped;
...


function TCustomComm.Write(const Buf; Count: Integer): Integer;

begin
FillChar(FWriteOS, Sizeof(FWriteOS), 0);
if not WriteFile(FHandle, Buf, Count, Result, @FWriteOS) then
Result := -1;
end;

[b:429dc6e0c8]aki está o Erro:[/b:429dc6e0c8]

Types of actual and formal var parameters must be indetifical

Obs.: Este erro está acontecendo na função WriteFile.

Se alguém puder me ajudar ficarei grato.

Gilmar Paiva


Megsoft

Megsoft

Curtidas 0

Respostas

Micheus

Micheus

24/07/2006

vc tentou retirar o @ antes do FWriteOS?


GOSTEI 0
Megsoft

Megsoft

24/07/2006

Já retirar mas o erro continua


GOSTEI 0
Antseralves

Antseralves

24/07/2006

Não use um parametro com nome [b:db5743aa84]Result[/b:db5743aa84] pois é uma palavra
´reservada´ para retorno de funções. Declare a variavel [b:db5743aa84]Res[/b:db5743aa84] como:

var Res : ^DWord;


Na função faça :

[b:db5743aa84]if not WriteFile(FHandle, Buf, Count, Res^, @FWriteOS) then....[/b:db5743aa84].

Acho que vai compilar..


GOSTEI 0
Micheus

Micheus

24/07/2006

[b:a5fffb2f14]antseralves[/b:a5fffb2f14], olhando melhor, realmente o problema está associado à Result. Entretanto, é devido ao fato de o parâmetro esperado por WriteFile ser do tipo DWORD, enquanto que Result estará implicitamente declarado como Integer.
Mas, alterar o retorno da função para DWORD não resolverá o problema, porque a seguir há uma atribuição a result de um valor que não é válido para este tipo (-1). A saída é realmente declarar uma variável para esta finalidade conforme vc sugeriu. Porém, seria conveniente que ela fosse declarada apenas: var Res :DWord;
A utilização do ^, faz com que essa variável seja do tipo ponteiro para um DWORD, ou seja, possui o endereço de uma área de memória que conterá um DWORD. Entretanto, se esta área não for previamente alocada poderá haver algum efeito colateral. :(

Não use um parametro com nome Result pois é uma palavra ´reservada´ para retorno de funções.
Não há qualquer restrição em utilizar Result nas operações dentro da função, já que é uma variável como outra qualquer.
Sobre declaração de Functions no help:
[i:a5fffb2f14]Every function implicitly has a local variable Result of the same type as the function´s return value.[/i:a5fffb2f14]
Traduzindo...:
[i:a5fffb2f14]Cada função tem implicitamente um variável local Result do mesmo tipo do valor retornado pela função.[/i:a5fffb2f14]

[]s


GOSTEI 0
Massuda

Massuda

24/07/2006

Mudando um pouco o enfoque...
Tenho um componente q peguei na net (Assync ) e usava no Delphi 3, qdo tentei compilar no Delphi 7...
Talvez fosse mais produtivo você usar um componente atualizado para o D7 do que tentar fazer esse componente antigo compilar/funcionar no D7.

Para comunicação serial tem estes que são gratuitos com fontes:[list:8b4009a4f5][*:8b4009a4f5][url=http://sourceforge.net/projects/tpapro/]AsyncPro[/url]: uma das melhores bibliotecas para comunicação serial[*:8b4009a4f5][url=http://sourceforge.net/projects/comport/]ComPort[/url]: uma biblioteca freeware muito popular[*:8b4009a4f5][url=http://www.ararat.cz/synapse/]SynaSer[/url]: biblioteca de classes para comunicação serial[/list:u:8b4009a4f5]


GOSTEI 0
Megsoft

Megsoft

24/07/2006

Para comunicação serial tem estes que são gratuitos com fontes:[list:21cf08cedd][*:21cf08cedd][url=http://sourceforge.net/projects/tpapro/]AsyncPro[/url]: uma das melhores bibliotecas para comunicação serial[*:21cf08cedd][url=http://sourceforge.net/projects/comport/]ComPort[/url]: uma biblioteca freeware muito popular[*:21cf08cedd][url=http://www.ararat.cz/synapse/]SynaSer[/url]: biblioteca de classes para comunicação serial[/list:u:21cf08cedd]


Tem toda razão, eu só estou utilizando este componente pq o caso era de estrema urgência e aplicação já estava funcionando com ele.


GOSTEI 0
POSTAR