我遇到了创建DLL的代码问题(或者可能是编译器设置)。
我试图创建一个DLL作为Windows 64下运行的软件包(ZEMAX)的扩展 - 虽然它是OLD(2005)的软件 - 升级它将花费&$ 5000美元并且它工作正常所以尝试是有意义的。
软件(ZEMAX)使用dll文件来扩展它可以做的事情,并期望这些DLL具有给出参数和返回给定值的函数。给出了示例代码,我可以将其编译为DLL,但软件无法找到函数。
示例代码由ZEMAX提供,我对其进行了少量修改。我想创建four_angle.dll。示例代码中的关键行(全部在C#中,我不想重写所有内容):
int __declspec(dllexport) APIENTRY UserParamSourceDefinition(double *data);
int __declspec(dllexport) APIENTRY UserParamNames(char *data);
BOOL WINAPI DllMain(HANDLE hInst, ULONG ul_reason_for_call, LPVOID lpReserved)
{
return TRUE;
}
以及稍后
int __declspec(dllexport) APIENTRY UserParamNames(char *data)
{
strcpy_s(data[1],16,'hello');
}
int __declspec(dllexport) APIENTRY UserSourceDefinition(double *data)
{
data[30] = (double)data[2] + 1.0;
}
Visual Studio编译没有错误。有没有理由在运行时加载DLL的软件无法调用这些函数?我是制作dll的新手,所以我不知道DLLMain的定义语句和选项是如何工作的。
PS - 我注意到visual studio还创建了一个DLLmain,我注释掉了,因为你无法定义两次。我再一次只知道它是如何工作的,如果我打算填写一些案例陈述。
#include "stdafx.h"
BOOL APIENTRY DllMain( HMODULE hModule, DWORD ul_reason_for_call,LPVOID lpReserved)
{
switch (ul_reason_for_call)
{
case DLL_PROCESS_ATTACH:
case DLL_THREAD_ATTACH:
case DLL_THREAD_DETACH:
case DLL_PROCESS_DETACH:
break;
}
return TRUE;
}
PPS我一直按照这里的说明进行操作 - 但没有运气:http://customers.zemax.com/os/resources/learn/knowledgebase/how-to-compile-a-user-defined-surface.aspx
答案 0 :(得分:1)
考虑到:
WINAPI
和APIENTRY
只是#define
到__stdcall
UserParamNames
函数由 .dll 版本导出:
_UserParamNames@4
?UserParamNames@@YGHPAD@Z
出现以下结论:
我只是在这里推测,但很可能你将函数定义放在 .cpp 文件中(默认编译为 C ++ )。
为了解决您的问题,请将您的功能导出为 C 。您修改了1 st 代码段(对于出现此问题的每个函数,您都必须执行相同的操作)。您可以按照以下方式执行此操作,也可以单独为每个功能添加extern "C"
。
#if defined(__cplusplus)
extern "C" {
#endif
__declspec(dllexport) int APIENTRY UserParamSourceDefinition(double *data);
__declspec(dllexport) int APIENTRY UserParamNames(char *data);
#if defined(__cplusplus)
}
#endif
有关详细信息(信息,代码,资源),请检查: