Erro na Funcao WriteFile
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
[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
Curtidas 0
Respostas
Micheus
24/07/2006
vc tentou retirar o @ antes do FWriteOS?
GOSTEI 0
Megsoft
24/07/2006
Já retirar mas o erro continua
GOSTEI 0
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..
´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
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. :(
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
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
24/07/2006
Mudando um pouco o enfoque...
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]
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
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