Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

Raficcha

Invalid Operation Pointer

Recommended Posts

Gente.. cheguei a conclusão que é impossivel instalar o ZEOS no Delphi 7 (pelo menos no meu)... não consegui encontrar o "segredo" da instalação.. então resolvi fazer sem ele mesmo.. consegui.. e fuciono bem, usando o componente SQLconnection e SQLQuery da paleta dbExpress (apenas esses dois) e tratei os resultados vindos do banco no braço... bom.. ai resolvi então criar uma dll e colocar isso tudo dentro.. bom, primeira vez que eu fiz, funcionou que chego dá gosto de ver.. ai fiz algumas alterações, ai começou a surgir uma mensagem de "invalid operation pointer"..

 

É uma mensagem muito estranha, por que se eu chamo a função sem nenhum "messagebox" dentro a função nem entra, ja se eu colocar uns "messagebox" ela vai ate o final e então da o erro.. alguem sabe me dizer como resolver isso

 

o codigo da biblioteca vai abaixo

 

library Project2;

{ Important note about DLL memory management: ShareMem must be the
  first unit in your library's USES clause AND your project's (select
  Project-View Source) USES clause if your DLL exports any procedures or
  functions that pass strings as parameters or function results. This
  applies to all strings passed to and from your DLL--even those that
  are nested in records and classes. ShareMem is the interface unit to
  the BORLNDMM.DLL shared memory manager, which must be deployed along
  with your DLL. To avoid using BORLNDMM.DLL, pass string information
  using PChar or ShortString parameters. }

uses
Variants, Classes, SqlExpr;
{$R *.res}
type
	Matriz_Resultado= array of array of variant;
var
	conexao : TSQLConnection;
	query: TSQLQuery;
	cn_database: string;


//funções
function conectar(PUsuario, PSenha, PDatabase: string; PHost: string = 'localhost'; PLibraryName: string = 'dbxopenmysql50.dll'; PVendorLib: string = 'libmysql.dll'): boolean; export;
begin
	try
		conexao := TSQLConnection.Create(nil);
		conexao.ConnectionName := 'teste';
		conexao.DriverName := 'MySQL50';
		conexao.GetDriverFunc := 'getSQLDriverMYSQL50';
		conexao.LibraryName := PLibraryName;
		  conexao.Params.add('DriverName=MySQL50');
		  conexao.Params.add('HostName='+PHost);
		  conexao.Params.add('Database='+PDatabase);
		  conexao.Params.add('User_Name='+PUsuario);
		  conexao.Params.add('Password='+PSenha);
		  conexao.Params.add('BlobSize=-1');
		  conexao.Params.add('ErrorResourceFile=');
		  conexao.Params.add('LocaleCode=0000');
		conexao.VendorLib := PVendorLib;
		conexao.LoginPrompt := false;
		//conexao.SQLConnection.connect(pchar(PHost), pchar(PUsuario), pchar(PSenha));
		//conexao.Connected := true;
		conexao.Open;

		query := TSQLQuery.Create(query);
		query.MaxBlobSize := -1;
		query.SQLConnection := conexao;
		query.SQL.Clear;

		Result := true;

	except
		Result := false;
	end;
end;

function Select(Tabela: string; Condicao: string; Colunas: string = '*'):Matriz_resultado; export;
var
	cont, cont2 : integer;
	Nome_Colunas : TStringList;
begin
	query.SQL.Clear;
	query.SQL.Add('SELECT '+Colunas+' FROM '+Tabela+' '+Condicao);
	//query.SQL.Add('SELECT * FROM produtos');

	query.ExecSQL(true);
	query.Active := true;
	Nome_Colunas := TStringList.Create;
	Nome_Colunas.Clear;

	query.GetFieldNames(Nome_Colunas);
	setLength(Result, Nome_Colunas.Count+1);
	//pegar o cabeçalho
		for cont := 0 to Nome_Colunas.Count-1 do begin
			setLength(Result[cont+1], 2);
			Result[cont+1, 1] := Nome_Colunas[cont];
		end;
	//pegar os registros
		for cont := 1 to Nome_Colunas.Count do begin
			setLength(Result[cont], query.RowsAffected+2);
			query.First;
			for cont2 := 1 to query.RowsAffected-1 do begin
				Result[cont, cont2+1] := query.Fields[0].DataSet.FieldValues[Nome_Colunas[cont-1]];
				query.Next;
			end;

		end;


end;

exports
	Conectar, Select;

//Implementação
begin


end.

O probelma é na funcção "Select". a função "conectar" funciona bem

 

 

eu fiz um programa que funciou (em parte, executava so uma vez a "Select"), mas depois, tentei fazer outro igual e não adintou mais.. so da erro

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não será porque está usando o query.ExecSQL(true); ao invés do Query.Open?? Ao que me consta, o ExecSql é para rotinas de insert, update e delete que se usa.

 

Outra coisa... query.open e query.active fazem com que a select seja executada e exibida... então só se usa um (no caso, o open mesmo).

 

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

Não funcionou.. mas ja arumei o codigo pra deixar so o query.open.

 

valeus.. ainda to procurando a resposta

Compartilhar este post


Link para o post
Compartilhar em outros sites

Bom, ainda procuro pela resposta.

 

Esqueci de falar uma coisa.. se eu colocar estas funções no form do projeto mesmo, elas funcionam superbem e sem nem sinal de erro

Compartilhar este post


Link para o post
Compartilhar em outros sites

Já verificou se sua query está realmente conectada ao BD quando chama o código via dll? Talvez seja necessário conectar ela antes do BD via dll antes do open.

 

[]'s

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.