gpt4 book ai didi

excel - 第三方 .xll 中可用的函数和方法

转载 作者:行者123 更新时间:2023-12-04 20:23:08 24 4
gpt4 key购买 nike

我们有一个我们在 excel 中注册的第 3 方 excel 插件。现在,我们如何查看该 .xll 中可用的所有函数和方法列表。
另外,我们可以看到 .xll 文件中的 vba 代码吗?
我正在使用 64 位 2016 Excel。下面是我尝试过的代码,但它没有显示 .xll 文件中可用的任何函数和子程序。

Public Sub ListRegisteredXLLFunctions()
Dim RegisteredFunctions As Variant
Dim i As Integer

RegisteredFunctions = Application.RegisteredFunctions


If IsNull(RegisteredFunctions) Then
Exit Sub
Else
Dim rng As Range
Set rng = SignalLogs.Range("A1")
Set rng = rng.Resize(UBound(RegisteredFunctions, 1), UBound(RegisteredFunctions, 2))
rng.Value = RegisteredFunctions
End If
End Sub

最佳答案

官方方法
使用Application.RegisteredFunctions在 VBA 中,但由于某种原因,这不适用于 OP。
快速方法
您可以运行 Dependencies并将 XLL 拖放到其主窗口中。右侧 Pane 将显示 XLL 的入口点,它实际上只是一个重命名的 DLL。 XLL 加载项注册的每个函数都应对应一个入口点(除非它像 xlOilExcelDNA 那样动态工作)。无法保证 Excel 中注册函数的名称与入口点名称匹配,但您可能会找到一个链接。
涉及方法
我们可以伪装成 Excel 并捕获对 xlfRegister 的调用。方法。下面我在 C++ 中使用较新版本的 C-API 为插件执行此操作。如果它使用较旧的 API,我们将需要欺骗 xlcall32.dll以类似的方式,定义 Excel4入口点。如果 GetProcAddress对于 SetExcel12EntryPt失败。

#include <iostream>
#include <windows.h>

// You need this header from the Excel C-API SDK
#include <Excel2013SDK/include/XLCALL.H>
#include <string>
using namespace std;

// Full path to the target XLL
static wstring TARGET = L"example.xll";

wstring to_wstring(LPXLOPER12 xloper)
{
if (!xloper) return L"(null)";
switch (xloper->xltype)
{
case xltypeNum: return to_wstring(xloper->val.num);
case xltypeBool: return to_wstring(xloper->val.xbool == 0);
case xltypeErr: return L"ERR:#" + to_wstring(xloper->val.err);
case xltypeMissing: return L"#MISSING";
case xltypeNil: return L"#NIL";
case xltypeInt: return to_wstring(xloper->val.w);
case xltypeStr: return wstring(xloper->val.str + 1, xloper->val.str[0]);
default:
return L"#UNKNOWN?";
}
}

int __stdcall MdCallBack12(int xlfn, int coper, LPXLOPER12* rgpxloper12, LPXLOPER12 result)
{
// It's possible an XLL may call other functions and except a valid return,
// so this switch may need expansion to other cases.
switch (xlfn)
{
case xlfRegister:
{
wcout << "xlfRegister: " << to_wstring(rgpxloper12[3])
<< L", argtypes=" << to_wstring(rgpxloper12[2]) << L" : ";
// We simply dump the parameters to the register call:
// Refer to the Excel SDK documentation for their meanings
for (auto i = 0; i < coper; ++i)
wcout << to_wstring(rgpxloper12[i]) << L", ";
cout << endl;
static int iFunc = 0;
if (result)
{
result->xltype = xltypeNum;
result->val.num = ++iFunc;
}
return xlretSuccess;
}
case xlGetInstPtr:
{
result->val.bigdata.h.hdata = GetModuleHandle(NULL);
result->xltype = xltypeBigData;
return xlretSuccess;
}
case xlGetInst:
{
result->val.w = (int)GetModuleHandle(NULL);
result->xltype = xltypeInt;
return xlretSuccess;
}
case xlGetHwnd:
{
result->val.w = (int)HWND_DESKTOP;
result->xltype = xltypeInt;
return xlretSuccess;
}
case xlEventRegister:
{
if (result)
{
result->val.xbool = 1;
result->xltype = xltypeBool;
}
return xlretSuccess;
}
case xlGetName:
{
auto len = TARGET.size() + 1;
auto s = new wchar_t[len];
s[0] = len;
wcsncpy_s(s + 1, len, TARGET.c_str(), len);
result->val.str = s;
result->xltype = xltypeStr;
return xlretSuccess;
}
default:
cout << "Called: " << xlfn << endl;
}
return xlretSuccess;
}

int main()
{
auto handle = LoadLibrary(TARGET.c_str());
if (handle == 0)
{
// If this load fails, ensure that xlcall32.dll is on the path.
// You can find this DLL in any Excel installation. Also ensure
// that any other dependencies the XLL needs can be found on the path.
cout << "Load failed" << endl;
return -1;
}

auto autoOpen = (int(*__stdcall)())GetProcAddress(handle, "xlAutoOpen");
if (autoOpen == 0)
{
cout << "Cannot find xlAutoOpen. Not a valid XLL." << endl;
return -1;
}

auto setExcel12EntryPt = (void(*__stdcall)(void*))GetProcAddress(handle, "SetExcel12EntryPt");
if (setExcel12EntryPt == 0)
{
cout << "Cannot find SetExcel12EntryPt. Probably uses older C-API." << endl;
return -1;
}

setExcel12EntryPt(&MdCallBack12);
autoOpen();

return 0;
}
确保您使用正确的位数构建以匹配加载项!您需要 Excel XLL SDK .

关于excel - 第三方 .xll 中可用的函数和方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67598584/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com