Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/163.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/csharp-4.0/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
P/Invoke,查找/声明函数入口点时出现问题 我对C++ DLL的P/UncCK调用有些困难。我遇到“找不到入口点”错误 < P>在C++中,我公开了函数,如……/P> #ifdef __cplusplus extern "C" { #endif __declspec(dllexport) long WINAPI MgScSCardUIDlgSelectCardW(__inout LPOPENCARDNAMEW_EX pOcne); #ifdef __cplusplus } #endif_C++_C# 4.0_Pinvoke_Dllimport - Fatal编程技术网

P/Invoke,查找/声明函数入口点时出现问题 我对C++ DLL的P/UncCK调用有些困难。我遇到“找不到入口点”错误 < P>在C++中,我公开了函数,如……/P> #ifdef __cplusplus extern "C" { #endif __declspec(dllexport) long WINAPI MgScSCardUIDlgSelectCardW(__inout LPOPENCARDNAMEW_EX pOcne); #ifdef __cplusplus } #endif

P/Invoke,查找/声明函数入口点时出现问题 我对C++ DLL的P/UncCK调用有些困难。我遇到“找不到入口点”错误 < P>在C++中,我公开了函数,如……/P> #ifdef __cplusplus extern "C" { #endif __declspec(dllexport) long WINAPI MgScSCardUIDlgSelectCardW(__inout LPOPENCARDNAMEW_EX pOcne); #ifdef __cplusplus } #endif,c++,c#-4.0,pinvoke,dllimport,C++,C# 4.0,Pinvoke,Dllimport,C#中的dllimport语句如下: [DllImport("mgsc.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)] public static extern Int32 MgScSCardUIDlgSelectCardW([MarshalAs(UnmanagedType.Struct)] [In, Out] ModWinsCard.OPENCARDNAME_EX ocnwex);

C#中的dllimport语句如下:

[DllImport("mgsc.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.Cdecl)]
public static extern Int32 MgScSCardUIDlgSelectCardW([MarshalAs(UnmanagedType.Struct)] [In, Out] ModWinsCard.OPENCARDNAME_EX ocnwex);
我在没有调用约定、标准和winapi调用约定的情况下尝试过这一点。所有人的结果都是一样的。我用DependencyWalker查看了公开的函数,并将其公开为“_MgScSCardUIDlgSelectCardW@4". 我知道装饰是正常的(但是声明'extern“C'”应该可以处理这个问题),但是我从来没有见过任何示例代码,其中dllimport的函数看起来是这样的,所以我似乎不应该这样调用它


我在这里看到了推荐.def文件的答案,但我不想去处理它,因为这只是我需要学习和改进的另一件事,当我只需要完成这项工作时。

DLL的一切都是正常的。您将从编译器添加到名称中的@4后缀中获益。它描述传递给函数的参数值的大小,结构指针为4字节。这会捕获客户端代码中函数声明中的错误,此类不匹配可能非常难以排除,因为它们会使堆栈失衡

这在这里也很有效,您几乎可以肯定地声明函数是错误的。您声明OPENCARDNAME_EX为结构而非类的几率为99%。这要求您通过引用而不是通过值传递参数。[Marshallas]属性也是错误的。修正:

[DllImport("mgsc.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall)]
public static extern Int32 MgScSCardUIDlgSelectCardW(ref ModWinsCard.OPENCARDNAME_EX ocnwex);

DLL一切正常。您将从编译器添加到名称中的@4后缀中获益。它描述传递给函数的参数值的大小,结构指针为4字节。这会捕获客户端代码中函数声明中的错误,此类不匹配可能非常难以排除,因为它们会使堆栈失衡

这在这里也很有效,您几乎可以肯定地声明函数是错误的。您声明OPENCARDNAME_EX为结构而非类的几率为99%。这要求您通过引用而不是通过值传递参数。[Marshallas]属性也是错误的。修正:

[DllImport("mgsc.dll", CharSet = CharSet.Unicode, CallingConvention = CallingConvention.StdCall)]
public static extern Int32 MgScSCardUIDlgSelectCardW(ref ModWinsCard.OPENCARDNAME_EX ocnwex);

这让我找到了我需要做的事情。那根本不是函数名。我必须将调用约定更改为StdCall,并使用[Marshallas(UnManagedType.Struct)[In,Out]ref.设置参数,并且,为了奖励,如果我将OPENCARDNAME_EX更改为类而不是结构,则仍然需要使用StdCall,并且[Marshallas(UnManagedType.LPStruct)][In,Out]对于参数。这让我想到了我需要做的事情。那根本不是函数名。我必须将调用约定更改为StdCall,并使用[Marshallas(UnManagedType.Struct)[[In,Out]ref]设置参数。另外,如果我将OPENCARDNAME_EX更改为类而不是结构,则仍然需要使用StdCall,并且参数的[Marshallas(UnManagedType.LPStruct)][In,Out]。