【发布时间】:2018-05-31 14:41:50
【问题描述】:
我对创建 DLL(或编译器设置)的代码有疑问。
我正在尝试创建一个 DLL,作为在 Windows 64 下运行的软件包 (ZEMAX) 的扩展 - 尽管该软件是旧的 (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
【问题讨论】:
-
它是特定于操作系统的。你可能需要一些
winapi或windows标签 -
APIENTRY是如何定义的?什么是编译器/链接器选项?你检查调用约定吗? -
您可以使用dependency walker查看函数是如何导出的,并与现有的Zemax插件进行比较
-
作为 DLL 新手,我不确定调用过程如何在 Windows 上工作。至于 APIENTRY,我想我遇到了一些说它是 WINAPI 的别名
-
至于编译器选项,我可能错过了很多(作为一个 gui 系统),但我按照网页下方的步骤进行操作,我放了一个链接:
标签: c dll compilation