简体   繁体   中英

How would you declare DLL import signature?

this is a follow-up post of Using pHash from .NET

How would you declare following C++ declaration in .NET?

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

So far i have

[DllImport(@"pHash.dll")]
public static extern int ph_dct_imagehash(string file, ref ulong hash);

But I am now getting following error for

ulong 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, ref hash1);
ph_dct_imagehash(secondImage, ref hash2);

在此处输入图像描述

It basically says that my declartion of ph_dtc_imagehash is wrong.
What am I doing wrong here?

Stack imbalance indicates that the C++ code uses cdecl and your C# uses stdcall calling convention. Change your DLLImport to this:

[DLLImport(@"pHash.dll", CallingConvention=CallingConvention.Cdecl)]

The function signature in C# (return value and parameters) is otherwise correct.

Check the calling convention. If you don't specify one on the DllImport attribute, it defaults to WinApi (stdcall). The C snippet you posted doesn't specify a calling convention, and at least in VC++ the default calling convention is cdecl.

So you should try:

[DllImport(@"pHash.dll", CallingConvention=CallingConvention.Cdecl)]
public static extern int ph_dct_imagehash(string file, ref ulong hash);

Try explicitly setting DllImportAttribute.CharSet property to CharSet.Auto as if you don't specify it, it will default to Ansi . This may be causing issues as your declaration seems to be fine.

Even if this is not the issue, take habit of specifying the CharSet property whenever a Dll function deals with text.

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM