在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 LongWNetGetConnection文档显示函数原型:

 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订阅程序。 它也可以在许多优秀的零售商。 (我故意不张贴链接。)