C++ 如何使方法可用于c+中的其他DLL+;托管代码中的dll?

C++ 如何使方法可用于c+中的其他DLL+;托管代码中的dll?,c++,clr,C++,Clr,第一段代码是我正在处理的示例,在将其更改为第二个示例后,它适用于uu declspec(dllexport),它给出了一个u declspec(dllexport)不能应用于具有u clrcall调用约定的函数。删除这段代码确实会使dll编译,但该方法对目标dll不可用。另外,当我使用PE资源管理器查看DLL时,没有导出方法。_uudeclspec(dllexport)是否有托管变体 C++/CLI编译器不支持导出托管函数。它会自动生成一个thunk,在必要时加载并初始化CLR,以便执行托管代码

第一段代码是我正在处理的示例,在将其更改为第二个示例后,它适用于uu declspec(dllexport),它给出了一个u declspec(dllexport)不能应用于具有u clrcall调用约定的函数。删除这段代码确实会使dll编译,但该方法对目标dll不可用。另外,当我使用PE资源管理器查看DLL时,没有导出方法。_uudeclspec(dllexport)是否有托管变体


C++/CLI编译器不支持导出托管函数。它会自动生成一个thunk,在必要时加载并初始化CLR,以便执行托管代码。当心头顶。但是,不能对函数参数使用任何托管类型。在你的情况下。这没有意义,调用函数的非托管代码不会使用托管类型

你得自己把它们整理好。这里没有问题,这些是指针,因此您可以简单地转换到IntPtr:

extern "C" __declspec(dllexport) 
int __stdcall UserInstruction (HWND hWnd, HINSTANCE hInst, double FAR *Function, char FAR *Str1, char FAR *Str2)
{
    IntPtr windowPtr = (IntPtr)hWnd;
    IntPtr instancePtr = (IntPtr)hInst;
    // etc..
}

明确选择调用约定始终是一个好主意。出于这个原因,我添加了stdcall,这是导出DLL函数最常见的一个。C++/CLI编译器确实支持导出托管函数。它会自动生成一个thunk,在必要时加载并初始化CLR,以便执行托管代码。当心头顶。但是,不能对函数参数使用任何托管类型。在你的情况下。这没有意义,调用函数的非托管代码不会使用托管类型

你得自己把它们整理好。这里没有问题,这些是指针,因此您可以简单地转换到IntPtr:

extern "C" __declspec(dllexport) 
int __stdcall UserInstruction (HWND hWnd, HINSTANCE hInst, double FAR *Function, char FAR *Str1, char FAR *Str2)
{
    IntPtr windowPtr = (IntPtr)hWnd;
    IntPtr instancePtr = (IntPtr)hInst;
    // etc..
}

明确选择调用约定始终是一个好主意。出于这个原因,我添加了stdcall,这是导出DLL函数最常见的方法。

@Naszta根据这个答案,一切都会生成,但PE Explorer仍然看不到任何导出的方法。此外,在尝试运行目标exe时,仍会抱怨无法访问UserInstruction。exe是在一个名为PReS的文件中生成的,无法更改,并且正在查找用户指令是否完全按照非托管方式导出。链接的答案不会生成非托管导出,答案已添加。@Naszta在该答案之后,所有内容都将生成,但PE Explorer仍然无法看到任何导出的方法。此外,在尝试运行目标exe时,仍会抱怨无法访问UserInstruction。exe是在一个名为PReS的文件中生成的,无法更改,并且正在查找要完全按照非托管方式导出的UserInstruction。链接的答案不会生成非托管导出,answer added。问题是出现错误C2065:“HWND”:未声明的标识符。此类必须将数据从PReS传递到C(PReS无法与C对话)。要使用Windows类型,您必须
\include
。然后出现错误C2065:'HWND':未声明的标识符。该类必须将数据从PReS传递到C#(PReS无法与C#对话)。要使用Windows类型,您必须
#包含