2011-06-06 4 views
9

estoy tratando de utilizar pHash de .NETEl uso de .NET pHash

primero que intenté fue registrar (regsvr32) phash.dll y preguntó here En segundo lugar, yo estaba tratando de importar usando DllImport como se muestra a continuación .

[DllImport(@".\Com\pHash.dll")] 
    public static extern int ph_dct_imagehash(
     [MarshalAs(UnmanagedType.LPStr)] string file, 
     UInt64 hash); 

Pero cuando intento acceder al método anterior durante el tiempo de ejecución, aparece el siguiente mensaje de error.

Unable to find an entry point named 'ph_dct_imagehash' in DLL '.\Com\pHash.dll'. 

¿Qué significa "punto de entrada" y por qué estoy consiguiendo el error?

Gracias.

FYI - Aquí está el código fuente completo

using System; 
using System.Diagnostics; 
using System.Runtime.InteropServices; 
using System.Windows; 

namespace DetectSimilarImages 
{ 
    public partial class MainWindow : Window 
    { 
     [DllImport(@".\Com\pHash.dll")] 
     public static extern int ph_dct_imagehash(
      [MarshalAs(UnmanagedType.LPStr)] string file, 
      UInt64 hash); 


     public MainWindow() 
     { 
      InitializeComponent(); 

      Loaded += MainWindow_Loaded; 
     } 

     void MainWindow_Loaded(object sender, RoutedEventArgs e) 
     { 
      try 
      { 
       UInt64 hash1 = 0, hash2 = 0; 
       string firstImage = @"C:\Users\dance2die\Pictures\2011-01-23\177.JPG"; 
       string secondImage = @"C:\Users\dance2die\Pictures\2011-01-23\176.JPG"; 
       ph_dct_imagehash(firstImage, hash1); 
       ph_dct_imagehash(secondImage, hash2); 

       Debug.WriteLine(hash1); 
       Debug.WriteLine(hash2); 
      } 
      catch (Exception ex) 
      { 

      } 
     } 


    } 
} 
+0

Quizás quiso compilar el DLL mismo? De ser así, ¿se ocupó de exportar adecuadamente la función relevante? –

+0

@konrad: compilé la fuente yo mismo pero estoy perdido de lo que dijiste sobre "exportar adecuadamente las funciones relevantes" porque no estoy familiarizado con C++ en absoluto ... – Sung

+1

@Sung Entonces la solución es fácil: * no lo hagas * compila la biblioteca tú mismo. Use el binario precompilado. –

Respuesta

13

El proyecto actual código fuente de Windows (a partir del 7/2011) en phash.org no parece exportar las llamadas a la API ph_ de la DLL. Usted tendrá que añadir éstos a sí mismo por __declspec (dllexport) al principio de la línea en pHash.h así:

__declspec(dllexport) int ph_dct_imagehash(const char* file,ulong64 &hash); 

A continuación, debería ver el espectáculo de exportación en el DLL utilizando dumpbin

dumpbin /EXPORTS pHash.dll 
... 
Dump of file pHash.dll 
... 
      1 0 00047A14 closedir = @ILT+2575(_closedir) 
      2 1 00047398 opendir = @ILT+915(_opendir) 
      3 2 00047A4B ph_dct_imagehash = @ILT+2630(_ph_dct_imagehash) 
      4 3 000477B2 readdir = @ILT+1965(_readdir) 
      5 4 00047A00 rewinddir = @ILT+2555(_rewinddir) 
      6 5 000477AD seekdir = @ILT+1960(_seekdir) 
      7 6 00047AFA telldir = @ILT+2805(_telldir) 

Ahora debería poder usar esta llamada desde C#.

embargo

...

estoy recibiendo un accidente en el código CImg cuando trato de llamar a esta, por lo que parece que hay un poco de more work to do here ...

+0

Esto falla para mí en png_read_info(), pero parece estar funcionando bien para los JPG – rupello

+2

Parece que PNG necesita más pasos: http://stackoverflow.com/questions/4001816/loading-pngs-with-cimg – rupello

+0

Pude ver '3 2 00047A4B ph_dct_imagehash = @ ILT + 2630 (_ph_dct_imagehash)' después de hacer dumpbin pero todavía no puedo importar img .dll. – Sung

Cuestiones relacionadas