在Excel VBA中将Windows API调用转换为64位
我在32位Excel中使用这个Windows API调用,它工作正常:
Declare Function WNetGetConnection Lib "MPR.DLL" _ Alias "WNetGetConnectionA" ( _ ByVal lpszLocalName As String, _ ByVal lpszRemoteName As String, _ lSize As Long) As Long
我被告知,我们的一小部分企业用户很快将会转向64位Excel。 我没有64位Excel的访问权限,我也找不到任何附近的同事。
根据这个文件,如果我正确地阅读它…
http://www.cadsharp.com/docs/Win32API_PtrSafe.txt
…这是64位Excel函数的正确语法:
Declare PtrSafe Function WNetGetConnection Lib "MPR.DLL" _ Alias "WNetGetConnectionA" ( _ ByVal lpszLocalName As String, _ ByVal lpszRemoteName As String, _ lSize As Long) As Long
但是这是正确的吗? 唯一的区别是添加PtrSafe。 它应该指向一个不同的,64位版本的MPR.DLL? 另外,lSize应该是LongLong而不是Long?
但是这是正确的吗?
是。 但不要听我的话。 获取Office的副本并进行testing。
唯一的区别是添加PtrSafe。 它应该指向一个不同的,64位版本的MPR.DLL?
不,Windows为您的进程select合适的DLL。 对于标准的WinAPI组件,您应该只使用DLL名称,而不要使用完整的path。 Windows会select正确的。
另外,lSize应该是LongLong而不是Long?
它应该是ByRef Long
。 WNetGetConnection
文档显示函数原型:
DWORD WNetGetConnection( _In_ LPCTSTR lpLocalName, _Out_ LPTSTR lpRemoteName, _Inout_ LPDWORD lpnLength );
DWORD
是一个32位无符号整数。 1 LPDWORD
是一个DWORD
的指针,它在VB(6 / A)中是ByRef lpnLength As Long
。
作为奖励:
- 在Windows API中,
LONG
也是32位。 这不会改变你是否运行32位或64位。 (sizeof(DWORD) == sizeof(LONG) == sizeof(INT)
) - VBA数据types
1 Fun事实:VBA没有无符号整数types,因为VB6没有它们。 VB6出现在98年。
截至2015年10月7日,Office 2016全新的从未使用过的单用户许可证约为150美元。 它也可以通过MSDN订阅程序。 它也可以在许多优秀的零售商。 (我故意不张贴链接。)