win32.h源码

最近在做window下的USB通讯,故整理出这些源码

/* src/include/port/win32.h */
 
#if defined(_MSC_VER) || defined(__BORLANDC__)
#define WIN32_ONLY_COMPILER
#endif
 
/*
 * Make sure _WIN32_WINNT has the minimum required value.
 * Leave a higher value in place. When building with at least Visual
 * Studio 2015 the minimum requirement is Windows Vista (0x0600) to
 * get support for GetLocaleInfoEx() with locales. For everything else
 * the minimum version is Windows XP (0x0501).
 * Also for VS2015, add a define that stops compiler complaints about
 * using the old Winsock API.
 */
#if defined(_MSC_VER) && _MSC_VER >= 1900
#define  _WINSOCK_DEPRECATED_NO_WARNINGS
#define MIN_WINNT 0x0600
#else
#define MIN_WINNT 0x0501
#endif
 
#if defined(_WIN32_WINNT) && _WIN32_WINNT < MIN_WINNT
#undef _WIN32_WINNT
#endif
 
#ifndef _WIN32_WINNT
#define _WIN32_WINNT MIN_WINNT
#endif
 
/*
 * Always build with SSPI support. Keep it as a #define in case
 * we want a switch to disable it sometime in the future.
 */
#ifndef __BORLANDC__
#define ENABLE_SSPI 1
#endif
 
/* undefine and redefine after #include */
#undef mkdir
 
#undef ERROR
 
/*
 * The Mingw64 headers choke if this is already defined - they
 * define it themselves.
 */
#if !defined(__MINGW64_VERSION_MAJOR) || defined(WIN32_ONLY_COMPILER)
#define _WINSOCKAPI_
#endif
#include <winsock2.h>
#include <ws2tcpip.h>
#include <windows.h>
#undef small
#include <process.h>
#include <signal.h>
#include <errno.h>
#include <direct.h>
#ifndef __BORLANDC__
#include <sys/utime.h>                  /* for non-unicode version */
#endif
#undef near
 
/* Must be here to avoid conflicting with prototype in windows.h */
#define mkdir(a,b)      mkdir(a)
 
#define ftruncate(a,b)  chsize(a,b)
 
/* Windows doesn't have fsync() as such, use _commit() */
#define fsync(fd) _commit(fd)
 
/*
 * For historical reasons, we allow setting wal_sync_method to
 * fsync_writethrough on Windows, even though it's really identical to fsync
 * (both code paths wind up at _commit()).
 */
#define HAVE_FSYNC_WRITETHROUGH
#define FSYNC_WRITETHROUGH_IS_FSYNC
 
#define USES_WINSOCK
 
/* defines for dynamic linking on Win32 platform
 *
 *      http://support.microsoft.com/kb/132044
 *      http://msdn.microsoft.com/en-us/library/8fskxacy(v=vs.80).aspx
 *      http://msdn.microsoft.com/en-us/library/a90k134d(v=vs.80).aspx
 */
 
#if defined(WIN32) || defined(__CYGWIN__)
 
#ifdef BUILDING_DLL
#define PGDLLIMPORT __declspec (dllexport)
#else                                                   /* not BUILDING_DLL */
#define PGDLLIMPORT __declspec (dllimport)
#endif
 
#ifdef _MSC_VER
#define PGDLLEXPORT __declspec (dllexport)
#else
#define PGDLLEXPORT
#endif
#else                                                   /* not CYGWIN, not MSVC, not MingW */
#define PGDLLIMPORT
#define PGDLLEXPORT
#endif
 
 
/*
 *      IPC defines
 */
#undef HAVE_UNION_SEMUN
#define HAVE_UNION_SEMUN 1
 
#define IPC_RMID 256
#define IPC_CREAT 512
#define IPC_EXCL 1024
#define IPC_PRIVATE 234564
#define IPC_NOWAIT      2048
#define IPC_STAT 4096
 
#define EACCESS 2048
#ifndef EIDRM
#define EIDRM 4096
#endif
 
#define SETALL 8192
#define GETNCNT 16384
#define GETVAL 65536
#define SETVAL 131072
#define GETPID 262144
 
 
/*
 *      Signal stuff
 *
 *      For WIN32, there is no wait() call so there are no wait() macros
 *      to interpret the return value of system().  Instead, system()
 *      return values < 0x100 are used for exit() termination, and higher
 *      values are used to indicated non-exit() termination, which is
 *      similar to a unix-style signal exit (think SIGSEGV ==
 *      STATUS_ACCESS_VIOLATION).  Return values are broken up into groups:
 *
 *      http://msdn2.microsoft.com/en-gb/library/aa489609.aspx
 *
 *              NT_SUCCESS                      0 - 0x3FFFFFFF
 *              NT_INFORMATION          0x40000000 - 0x7FFFFFFF
 *              NT_WARNING                      0x80000000 - 0xBFFFFFFF
 *              NT_ERROR                        0xC0000000 - 0xFFFFFFFF
 *
 *      Effectively, we don't care on the severity of the return value from
 *      system(), we just need to know if it was because of exit() or generated
 *      by the system, and it seems values >= 0x100 are system-generated.
 *      See this URL for a list of WIN32 STATUS_* values:
 *
 *              Wine (URL used in our error messages) -
 *                      http://source.winehq.org/source/include/ntstatus.h
 *              Descriptions - http://www.comp.nus.edu.sg/~wuyongzh/my_doc/ntstatus.txt
 *              MS SDK - http://www.nologs.com/ntstatus.html
 *
 *      It seems the exception lists are in both ntstatus.h and winnt.h, but
 *      ntstatus.h has a more comprehensive list, and it only contains
 *      exception values, rather than winnt, which contains lots of other
 *      things:
 *
 *              http://www.microsoft.com/msj/0197/exception/exception.aspx
 *
 *              The ExceptionCode parameter is the number that the operating system
 *              assigned to the exception. You can see a list of various exception codes
 *              in WINNT.H by searching for #defines that start with "STATUS_". For
 *              example, the code for the all-too-familiar STATUS_ACCESS_VIOLATION is
 *              0xC0000005. A more complete set of exception codes can be found in
 *              NTSTATUS.H from the Windows NT DDK.
 *
 *      Some day we might want to print descriptions for the most common
 *      exceptions, rather than printing an include file name.  We could use
 *      RtlNtStatusToDosError() and pass to FormatMessage(), which can print
 *      the text of error values, but MinGW does not support
 *      RtlNtStatusToDosError().
 */
#define WIFEXITED(w)    (((w) & 0XFFFFFF00) == 0)
#define WIFSIGNALED(w)  (!WIFEXITED(w))
#define WEXITSTATUS(w)  (w)
#define WTERMSIG(w)             (w)
 
#define sigmask(sig) ( 1 << ((sig)-1) )
 
/* Signal function return values */
#undef SIG_DFL
#undef SIG_ERR
#undef SIG_IGN
#define SIG_DFL ((pqsigfunc)0)
#define SIG_ERR ((pqsigfunc)-1)
#define SIG_IGN ((pqsigfunc)1)
 
/* Some extra signals */
#define SIGHUP                          1
#define SIGQUIT                         3
#define SIGTRAP                         5
#define SIGABRT                         22      /* Set to match W32 value -- not UNIX value */
#define SIGKILL                         9
#define SIGPIPE                         13
#define SIGALRM                         14
#define SIGSTOP                         17
#define SIGTSTP                         18
#define SIGCONT                         19
#define SIGCHLD                         20
#define SIGTTIN                         21
#define SIGTTOU                         22      /* Same as SIGABRT -- no problem, I hope */
#define SIGWINCH                        28
#ifndef __BORLANDC__
#define SIGUSR1                         30
#define SIGUSR2                         31
#endif
 
/*
 * New versions of mingw have gettimeofday() and also declare
 * struct timezone to support it.
 */
#ifndef HAVE_GETTIMEOFDAY
struct timezone
{
        int                     tz_minuteswest; /* Minutes west of GMT.  */
        int                     tz_dsttime;             /* Nonzero if DST is ever in effect.  */
};
#endif
 
/* for setitimer in backend/port/win32/timer.c */
#define ITIMER_REAL 0
struct itimerval
{
        struct timeval it_interval;
        struct timeval it_value;
};
 
int                     setitimer(int which, const struct itimerval * value, struct itimerval * ovalue);
 
/*
 * WIN32 does not provide 64-bit off_t, but does provide the functions operating
 * with 64-bit offsets.
 */
#define pgoff_t __int64
#ifdef WIN32_ONLY_COMPILER
#define fseeko(stream, offset, origin) _fseeki64(stream, offset, origin)
#define ftello(stream) _ftelli64(stream)
#else
#ifndef fseeko
#define fseeko(stream, offset, origin) fseeko64(stream, offset, origin)
#endif
#ifndef ftello
#define ftello(stream) ftello64(stream)
#endif
#endif
 
/*
 * Supplement to <sys/types.h>.
 *
 * Perl already has typedefs for uid_t and gid_t.
 */
#ifndef PLPERL_HAVE_UID_GID
typedef int uid_t;
typedef int gid_t;
#endif
typedef long key_t;
 
#ifdef WIN32_ONLY_COMPILER
typedef int pid_t;
#endif
 
/*
 * Supplement to <sys/stat.h>.
 */
#define lstat(path, sb) stat((path), (sb))
 
/*
 * Supplement to <fcntl.h>.
 * This is the same value as _O_NOINHERIT in the MS header file. This is
 * to ensure that we don't collide with a future definition. It means
 * we cannot use _O_NOINHERIT ourselves.
 */
#define O_DSYNC 0x0080
 
/*
 * Supplement to <errno.h>.
 *
 * We redefine network-related Berkeley error symbols as the corresponding WSA
 * constants.  This allows elog.c to recognize them as being in the Winsock
 * error code range and pass them off to pgwin32_socket_strerror(), since
 * Windows' version of plain strerror() won't cope.  Note that this will break
 * if these names are used for anything else besides Windows Sockets errors.
 * See TranslateSocketError() when changing this list.
 */
#undef EAGAIN
#define EAGAIN WSAEWOULDBLOCK
#undef EINTR
#define EINTR WSAEINTR
#undef EMSGSIZE
#define EMSGSIZE WSAEMSGSIZE
#undef EAFNOSUPPORT
#define EAFNOSUPPORT WSAEAFNOSUPPORT
#undef EWOULDBLOCK
#define EWOULDBLOCK WSAEWOULDBLOCK
#undef ECONNABORTED
#define ECONNABORTED WSAECONNABORTED
#undef ECONNRESET
#define ECONNRESET WSAECONNRESET
#undef EINPROGRESS
#define EINPROGRESS WSAEINPROGRESS
#undef EISCONN
#define EISCONN WSAEISCONN
#undef ENOBUFS
#define ENOBUFS WSAENOBUFS
#undef EPROTONOSUPPORT
#define EPROTONOSUPPORT WSAEPROTONOSUPPORT
#undef ECONNREFUSED
#define ECONNREFUSED WSAECONNREFUSED
#undef ENOTSOCK
#define ENOTSOCK WSAENOTSOCK
#undef EOPNOTSUPP
#define EOPNOTSUPP WSAEOPNOTSUPP
#undef EADDRINUSE
#define EADDRINUSE WSAEADDRINUSE
#undef EADDRNOTAVAIL
#define EADDRNOTAVAIL WSAEADDRNOTAVAIL
#undef EHOSTUNREACH
#define EHOSTUNREACH WSAEHOSTUNREACH
#undef ENOTCONN
#define ENOTCONN WSAENOTCONN
 
/*
 * Extended locale functions with gratuitous underscore prefixes.
 * (These APIs are nevertheless fully documented by Microsoft.)
 */
#define locale_t _locale_t
#define tolower_l _tolower_l
#define toupper_l _toupper_l
#define towlower_l _towlower_l
#define towupper_l _towupper_l
#define isdigit_l _isdigit_l
#define iswdigit_l _iswdigit_l
#define isalpha_l _isalpha_l
#define iswalpha_l _iswalpha_l
#define isalnum_l _isalnum_l
#define iswalnum_l _iswalnum_l
#define isupper_l _isupper_l
#define iswupper_l _iswupper_l
#define islower_l _islower_l
#define iswlower_l _iswlower_l
#define isgraph_l _isgraph_l
#define iswgraph_l _iswgraph_l
#define isprint_l _isprint_l
#define iswprint_l _iswprint_l
#define ispunct_l _ispunct_l
#define iswpunct_l _iswpunct_l
#define isspace_l _isspace_l
#define iswspace_l _iswspace_l
#define strcoll_l _strcoll_l
#define strxfrm_l _strxfrm_l
#define wcscoll_l _wcscoll_l
#define wcstombs_l _wcstombs_l
#define mbstowcs_l _mbstowcs_l
 
 
/* In backend/port/win32/signal.c */
extern PGDLLIMPORT volatile int pg_signal_queue;
extern PGDLLIMPORT int pg_signal_mask;
extern HANDLE pgwin32_signal_event;
extern HANDLE pgwin32_initial_signal_pipe;
 
#define UNBLOCKED_SIGNAL_QUEUE()        (pg_signal_queue & ~pg_signal_mask)
 
 
void            pgwin32_signal_initialize(void);
HANDLE          pgwin32_create_signal_listener(pid_t pid);
void            pgwin32_dispatch_queued_signals(void);
void            pg_queue_signal(int signum);
 
/* In backend/port/win32/socket.c */
#ifndef FRONTEND
#define socket(af, type, protocol) pgwin32_socket(af, type, protocol)
#define bind(s, addr, addrlen) pgwin32_bind(s, addr, addrlen)
#define listen(s, backlog) pgwin32_listen(s, backlog)
#define accept(s, addr, addrlen) pgwin32_accept(s, addr, addrlen)
#define connect(s, name, namelen) pgwin32_connect(s, name, namelen)
#define select(n, r, w, e, timeout) pgwin32_select(n, r, w, e, timeout)
#define recv(s, buf, len, flags) pgwin32_recv(s, buf, len, flags)
#define send(s, buf, len, flags) pgwin32_send(s, buf, len, flags)
 
SOCKET          pgwin32_socket(int af, int type, int protocol);
int                     pgwin32_bind(SOCKET s, struct sockaddr * addr, int addrlen);
int                     pgwin32_listen(SOCKET s, int backlog);
SOCKET          pgwin32_accept(SOCKET s, struct sockaddr * addr, int *addrlen);
int                     pgwin32_connect(SOCKET s, const struct sockaddr * name, int namelen);
int                     pgwin32_select(int nfds, fd_set *readfs, fd_set *writefds, fd_set *exceptfds, const struct timeval * timeout);
int                     pgwin32_recv(SOCKET s, char *buf, int len, int flags);
int                     pgwin32_send(SOCKET s, const void *buf, int len, int flags);
 
const char *pgwin32_socket_strerror(int err);
int                     pgwin32_waitforsinglesocket(SOCKET s, int what, int timeout);
 
extern int      pgwin32_noblock;
 
#endif
 
/* in backend/port/win32_shmem.c */
extern int      pgwin32_ReserveSharedMemoryRegion(HANDLE);
 
/* in backend/port/win32/crashdump.c */
extern void pgwin32_install_crashdump_handler(void);
 
/* in port/win32error.c */
extern void _dosmaperr(unsigned long);
 
/* in port/win32env.c */
extern int      pgwin32_putenv(const char *);
extern void pgwin32_unsetenv(const char *);
 
/* in port/win32security.c */
extern int      pgwin32_is_service(void);
extern int      pgwin32_is_admin(void);
 
#define putenv(x) pgwin32_putenv(x)
#define unsetenv(x) pgwin32_unsetenv(x)
 
/* Things that exist in MingW headers, but need to be added to MSVC & BCC */
#ifdef WIN32_ONLY_COMPILER
 
#ifndef _WIN64
typedef long ssize_t;
#else
typedef __int64 ssize_t;
#endif
 
#ifndef __BORLANDC__
typedef unsigned short mode_t;
 
#define S_IRUSR _S_IREAD
#define S_IWUSR _S_IWRITE
#define S_IXUSR _S_IEXEC
#define S_IRWXU (S_IRUSR | S_IWUSR | S_IXUSR)
/* see also S_IRGRP etc below */
#define S_ISDIR(m) (((m) & S_IFMT) == S_IFDIR)
#define S_ISREG(m) (((m) & S_IFMT) == S_IFREG)
#endif   /* __BORLANDC__ */
 
#define F_OK 0
#define W_OK 2
#define R_OK 4
 
#if (_MSC_VER < 1800)
#define isinf(x) ((_fpclass(x) == _FPCLASS_PINF) || (_fpclass(x) == _FPCLASS_NINF))
#define isnan(x) _isnan(x)
#endif
 
/* Pulled from Makefile.port in mingw */
#define DLSUFFIX ".dll"
 
#ifdef __BORLANDC__
 
/* for port/dirent.c */
#ifndef INVALID_FILE_ATTRIBUTES
#define INVALID_FILE_ATTRIBUTES ((DWORD) -1)
#endif
 
/* for port/open.c */
#ifndef O_RANDOM
#define O_RANDOM                0x0010  /* File access is primarily random */
#define O_SEQUENTIAL    0x0020  /* File access is primarily sequential */
#define O_TEMPORARY             0x0040  /* Temporary file bit */
#define O_SHORT_LIVED   0x1000  /* Temporary storage file, try not to flush */
#define _O_SHORT_LIVED  O_SHORT_LIVED
#endif   /* ifndef O_RANDOM */
#endif   /* __BORLANDC__ */
#endif   /* WIN32_ONLY_COMPILER */
 
/* These aren't provided by either MingW or MSVC */
#ifndef __BORLANDC__
#define S_IRGRP 0
#define S_IWGRP 0
#define S_IXGRP 0
#define S_IRWXG 0
#define S_IROTH 0
#define S_IWOTH 0
#define S_IXOTH 0
#define S_IRWXO 0
 
#endif   /* __BORLANDC__ */
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
以下是使用 C 语言 Win32API 实现读取 Excel 表格的示例代码: ``` #include <windows.h> #include <ole2.h> // 需要引入 OLE2 库 #include <olectl.h> #include <ocidl.h> int main() { // 初始化 COM 库 CoInitialize(NULL); // 创建 Excel 应用程序实例 CLSID clsid; CLSIDFromProgID(L"Excel.Application", &clsid); IDispatch* pExcel = NULL; CoCreateInstance(clsid, NULL, CLSCTX_LOCAL_SERVER, IID_IDispatch, (void **)&pExcel); // 打开 Excel 文件 VARIANT vtFilename; vtFilename.vt = VT_BSTR; vtFilename.bstrVal = SysAllocString(L"C:\\test.xlsx"); VARIANT vtReadOnly; vtReadOnly.vt = VT_BOOL; vtReadOnly.boolVal = TRUE; VARIANT vtMissing; vtMissing.vt = VT_ERROR; vtMissing.scode = DISP_E_PARAMNOTFOUND; VARIANT vtWorkbooks; DISPID dispid; DISPPARAMS dispparams = {&vtFilename, &vtMissing, &vtReadOnly, NULL}; pExcel->GetIDsOfNames(IID_NULL, L"Workbooks", 1, LOCALE_SYSTEM_DEFAULT, &dispid); pExcel->Invoke(dispid, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_PROPERTYGET, &dispparams, &vtWorkbooks, NULL, NULL); // 获取活动工作簿 VARIANT vtActiveWorkbook; dispid = 0x0000003D; // ActiveWorkbook 的 DISPID dispparams.cArgs = 0; dispparams.cNamedArgs = 0; pExcel->Invoke(dispid, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_PROPERTYGET, &dispparams, &vtActiveWorkbook, NULL, NULL); // 获取活动工作表 VARIANT vtActiveSheet; dispid = 0x0000002B; // ActiveSheet 的 DISPID dispparams.cArgs = 0; dispparams.cNamedArgs = 0; vtActiveSheet.vt = VT_DISPATCH; vtActiveSheet.pdispVal = NULL; pExcel->Invoke(dispid, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_PROPERTYGET, &dispparams, &vtActiveSheet, NULL, NULL); // 获取活动工作表的名称 VARIANT vtName; dispid = 0x00000006; // Name 的 DISPID dispparams.cArgs = 0; dispparams.cNamedArgs = 0; pActiveSheet->Invoke(dispid, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_PROPERTYGET, &dispparams, &vtName, NULL, NULL); wprintf(L"Active worksheet name: %s\n", vtName.bstrVal); // 获取行数和列数 VARIANT vtRows; VARIANT vtColumns; dispparams.cArgs = 1; dispparams.cNamedArgs = 1; DISPID dispidRows; DISPID dispidColumns; BSTR bstrRows = SysAllocString(L"Rows"); BSTR bstrColumns = SysAllocString(L"Columns"); pActiveSheet->GetIDsOfNames(IID_NULL, &bstrRows, 1, LOCALE_SYSTEM_DEFAULT, &dispidRows); pActiveSheet->GetIDsOfNames(IID_NULL, &bstrColumns, 1, LOCALE_SYSTEM_DEFAULT, &dispidColumns); dispparams.cArgs = 0; dispparams.cNamedArgs = 0; pActiveSheet->Invoke(dispidRows, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_PROPERTYGET, &dispparams, &vtRows, NULL, NULL); pActiveSheet->Invoke(dispidColumns, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_PROPERTYGET, &dispparams, &vtColumns, NULL, NULL); wprintf(L"Number of rows: %d\n", vtRows.lVal); wprintf(L"Number of columns: %d\n", vtColumns.lVal); // 读取单元格内容 VARIANT vtCellValue; dispid = 0x00000000; // Item 的 DISPID dispparams.cArgs = 2; dispparams.cNamedArgs = 0; VARIANT vtRow; vtRow.vt = VT_I4; vtRow.lVal = 1; VARIANT vtColumn; vtColumn.vt = VT_I4; vtColumn.lVal = 1; dispparams.rgvarg = &vtColumn; dispparams.rgvarg[1] = &vtRow; pActiveSheet->Invoke(dispid, IID_NULL, LOCALE_SYSTEM_DEFAULT, DISPATCH_PROPERTYGET, &dispparams, &vtCellValue, NULL, NULL); wprintf(L"Cell value at (1, 1): %s\n", vtCellValue.bstrVal); // 释放资 VariantClear(&vtFilename); VariantClear(&vtReadOnly); VariantClear(&vtMissing); VariantClear(&vtWorkbooks); VariantClear(&vtActiveWorkbook); VariantClear(&vtActiveSheet); VariantClear(&vtName); VariantClear(&vtRows); VariantClear(&vtColumns); VariantClear(&vtCellValue); SysFreeString(vtName.bstrVal); SysFreeString(bstrRows); SysFreeString(bstrColumns); pActiveSheet->Release(); pActiveWorkbook->Release(); pWorkbooks->Release(); pExcel->Release(); // 反初始化 COM 库 CoUninitialize(); return 0; } ``` 注意:运行此代码需要在编译选项中添加 OLE2 库的链接。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值