Quintas,
Não sei se entendi bem sua pergunta.
O aplicativo precisa do certificado para assinar o XML gerado, garantindo sua autenticidade.
De qualquer forma, mesmo que seja possÃvel com a CAPICOM, seria interessante ter outras
alternativas, porque ela foi descontinuada há muito tempo.
Vasculhando o fórum e estudando um pouco os códigos em C#, consegui criar uma DLL no Visual Studio,
com suporte a acesso via COM. Com ela, foi possÃvel fazer uma ponte e acessar o .NET framework via Harbour.
Para chegar nesse resultado, utilizei um tópico aqui do próprio fórum como base, apenas atualizando alguns detalhes para a
versão mais recente do Visual Studio e do .NET. Também me baseei no código em C# do site oficial da NFe para fazer os testes.
Não sou programador C#, nem tenho muito conhecimento em COM, sou apenas curioso, mas acho que o código abaixo pode servir
como base para outros, com mais experiência.
Tópico usado como base para criar a DLL:
http://www.pctoledo.com.br/forum/viewtopic.php?f=43&t=13894&p=125891&hilit=dll#p125891Código em C#:
using System;
using System.Collections.Generic;
using System.Linq;
using System.Runtime.InteropServices;
using System.Security.Cryptography.X509Certificates;
using System.Text;
using System.Threading.Tasks;
namespace TesteCSharpHarbour
{
[ClassInterface(ClassInterfaceType.AutoDual)]
[ProgId("TesteCSharpHarbour.Teste")]
[ComVisible(true)]
public class Teste
{
public Teste() { }
public String[] ListaCertificados()
{
X509Store stores = new X509Store(StoreName.My, StoreLocation.CurrentUser);
String[] listaDeCertificados;
int contador = 0;
try
{
// Abre o Store
stores.Open(OpenFlags.ReadOnly);
// Obtém a coleção dos certificados da Store
X509Certificate2Collection certificados = stores.Certificates;
listaDeCertificados = new String[certificados.Count];
// percorre a coleção de certificados
foreach (X509Certificate2 certificado in certificados)
{
listaDeCertificados[contador] = certificado.ToString();
contador++;
}
return listaDeCertificados;
}
finally
{
stores.Close();
}
}
}
}
Código em Harbour:
LOCAL oDotNetDll
LOCAL a01
TRY
oDotNetDll := GetActiveObject( "TesteCSharpHarbour.Teste" )
CATCH
TRY
oDotNetDll := CreateObject( "TesteCSharpHarbour.Teste" )
CATCH
Alert( Ole2TxtError() )
RETURN .F.
END
END
a01 := oDotNetDll:ListaCertificados()
LogDebug( a01 )