Uma biblioteca Delphi/FreePascal que fornece um wrapper amigável e type-safe para trabalhar com SafeArrays COM, especialmente útil para interoperabilidade COM/.NET.
Trabalhar com SafeArrays em Delphi pode ser complexo e propenso a erros. Esta biblioteca simplifica o uso de SafeArrays através de uma interface intuitiva com gerenciamento automático de memória.
- Interface-based: Gerenciamento automático de memória através de reference counting
- API Intuitiva: Acesso aos elementos como arrays nativos do Delphi
- Type-safe: Validação de índices e tipos em tempo de execução
- Conversões Fáceis: Métodos para converter entre SafeArray e arrays nativos
- Suporte Multidimensional: Trabalhe com arrays de múltiplas dimensões
- Documentação Completa: XMLDoc em todo o código
- Bem Testado: Suite completa de testes com DUnitX
- Delphi 2010 ou superior
- FreePascal 3.0 ou superior (modo Delphi)
- Windows (usa Windows API para SafeArray)
- Clone o repositório:
git clone https://github.com/mmfbr/DelphiSafeArrayHelper.git-
Adicione o caminho da pasta
srcao Library Path do seu projeto -
Adicione
SafeArrayWrapperà cláusula uses:
uses
SafeArrayWrapper;var
SafeArr: ISafeArrayWrapper;
begin
// Array de inteiros com 10 elementos (índices 0..9)
SafeArr := CreateSafeArray(varInteger, 10);
// Array com bounds customizados [5..15]
SafeArr := TSafeArrayWrapper.Create(varInteger, 5, 15);
// Array multidimensional 3x4
SafeArr := CreateSafeArray(varVariant, [0, 2, 0, 3]);
end;// Array unidimensional
SafeArr[0] := 100;
Value := SafeArr[0];
// Array multidimensional
SafeArr[[1, 2]] := 'Hello';
Value := SafeArr[[1, 2]];// De Variant para SafeArray wrapper
var
VarArr: Variant;
SafeArr: ISafeArrayWrapper;
begin
VarArr := VarArrayCreate([0, 4], varDouble);
SafeArr := VariantToSafeArray(VarArr);
end;
// De SafeArray wrapper para arrays nativos
var
IntArray: TArray<Integer>;
StrArray: TArray<string>;
begin
IntArray := SafeArr.ToIntegerArray;
StrArray := SafeArr.ToStringArray;
end;uses
mscorlib_TLB,
SafeArrayWrapper;
var
DotNetArray: OleVariant;
SafeArr: ISafeArrayWrapper;
Args: OleVariant;
begin
// Preparar argumentos para método .NET
SafeArr := CreateSafeArray(varVariant, 2);
SafeArr[0] := 'Hello';
SafeArr[1] := 'World';
// Converter para passar ao método
Args := SafeArr.ToVariantArray;
DotNetObject.MethodThatExpectsArray(Args);
// Receber array de método .NET
DotNetArray := DotNetObject.GetNames();
SafeArr := VariantToSafeArray(DotNetArray);
// Processar elementos
for I := 0 to SafeArr.Count - 1 do
ProcessName(SafeArr[I]);
end;O projeto inclui uma suite completa de testes usando DUnitX:
- Abra
tests/SafeArrayWrapperTests.dprojno Delphi - Compile e execute o projeto
- Verifique os resultados no console ou GUI do DUnitX
Count: Integer- Número total de elementosDimensions: Integer- Número de dimensõesItems[Index]: Variant- Acesso indexado (propriedade default)VarType: TVarType- Tipo dos elementosSafeArray: PSafeArray- Ponteiro para o SafeArray nativo
GetLBound(Dimension: Integer = 1): Integer- Limite inferiorGetUBound(Dimension: Integer = 1): Integer- Limite superiorClear- Limpa todos os elementosResize(NewSize: Integer)- Redimensiona o arrayAppend(Value: Variant)- Adiciona elemento ao finalToVariantArray: Variant- Converte para Variant arrayToStringArray: TArray<string>- Converte para array de stringsToIntegerArray: TArray<Integer>- Converte para array de inteirosToDoubleArray: TArray<Double>- Converte para array de doubles
CreateSafeArray(VarType: TVarType; Count: Integer): ISafeArrayWrapperWrapSafeArray(SafeArray: PSafeArray; OwnsData: Boolean = False): ISafeArrayWrapperVariantToSafeArray(Variant: Variant): ISafeArrayWrapper
Contribuições são bem-vindas! Por favor:
- Faça um Fork do projeto
- Crie uma branch para sua feature (
git checkout -b feature/AmazingFeature) - Commit suas mudanças (
git commit -m 'Add some AmazingFeature') - Push para a branch (
git push origin feature/AmazingFeature) - Abra um Pull Request
Este projeto está licenciado sob a MIT License - veja o arquivo LICENSE para detalhes.
- Comunidade Delphi por anos de conhecimento compartilhado sobre COM e SafeArrays
- Contribuidores do projeto DUnitX por fornecer um excelente framework de testes
Seu Nome - @mmfbr77
Link do Projeto: https://github.com/mmfbr/DelphiSafeArrayHelper