sysallocstring
时间: 2023-10-04 21:12:02 浏览: 35
sysallocstring 是一个Windows API函数,被用于在Windows环境下分配Unicode字符串的内存空间。它接收一个ANSI字符串作为参数,并将其转换为Unicode字符串,然后在进程的堆中分配一块内存用于存储该字符串,返回一个指向该内存块的指针。这个函数通常在COM编程中使用,因为COM需要使用Unicode字符串。
相关问题
c语言读取excel数据存储在数组里
要在C语言中读取Excel数据并将其存储在数组中,可以使用以下步骤:
1. 包含必要的头文件和库:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <math.h>
#include <errno.h>
#include <windows.h>
#include <ole2.h>
#include <olectl.h>
#include <ocidl.h>
```
2. 使用COM接口打开Excel文件,并获取工作簿和工作表对象:
```c
// 打开Excel文件
CoInitialize(NULL);
IDispatch* pXLApp = NULL;
CLSID clsid;
CLSIDFromProgID(L"Excel.Application", &clsid);
HRESULT hr = CoCreateInstance(clsid, NULL, CLSCTX_LOCAL_SERVER, IID_IDispatch, (void**)&pXLApp);
if (FAILED(hr)) {
printf("Failed to create Excel instance.\n");
return 1;
}
// 打开工作簿
VARIANT varFileName;
VariantInit(&varFileName);
varFileName.vt = VT_BSTR;
varFileName.bstrVal = SysAllocString(L"example.xlsx"); // Excel文件名
IDispatch* pWorkbooks = NULL;
hr = pXLApp->GetIDispatch(L"Workbooks", (void**)&pWorkbooks);
if (FAILED(hr)) {
printf("Failed to get Workbooks object.\n");
return 1;
}
IDispatch* pWorkbook = NULL;
hr = pWorkbooks->Invoke(0x3ec, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET, &dispparamsNoArgs, &varResult, NULL, NULL);
if (FAILED(hr)) {
printf("Failed to get item(1) of Workbooks object.\n");
return 1;
}
// 获取工作表对象
VARIANT varWorksheetName;
VariantInit(&varWorksheetName);
varWorksheetName.vt = VT_BSTR;
varWorksheetName.bstrVal = SysAllocString(L"Sheet1"); // 工作表名
IDispatch* pWorksheets = NULL;
hr = pWorkbook->GetIDispatch(L"Worksheets", (void**)&pWorksheets);
if (FAILED(hr)) {
printf("Failed to get Worksheets object.\n");
return 1;
}
IDispatch* pWorksheet = NULL;
hr = pWorksheets->Invoke(0x74, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET, &dispparamsNoArgs, &varResult, NULL, NULL);
if (FAILED(hr)) {
printf("Failed to get Item() of Worksheets object.\n");
return 1;
}
```
3. 获取Excel数据的范围,并确定数组的大小:
```c
// 获取数据范围
VARIANT varRangeName;
VariantInit(&varRangeName);
varRangeName.vt = VT_BSTR;
varRangeName.bstrVal = SysAllocString(L"A1:C10"); // 数据范围
IDispatch* pRange = NULL;
hr = pWorksheet->GetIDsOfNames(IID_NULL, &varRangeName.bstrVal, 1, LOCALE_USER_DEFAULT, &dispid);
if (FAILED(hr)) {
printf("Failed to get IDs of names.\n");
return 1;
}
hr = pWorksheet->Invoke(dispid, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET, &dispparamsNoArgs, &varResult, NULL, NULL);
if (FAILED(hr)) {
printf("Failed to get Range object.\n");
return 1;
}
pRange = varResult.pdispVal;
// 获取数据大小
long numRows = 0;
long numCols = 0;
hr = pRange->GetIDsOfNames(IID_NULL, &dispidNumRows, 1, LOCALE_USER_DEFAULT, &dispid);
if (FAILED(hr)) {
printf("Failed to get IDs of names.\n");
return 1;
}
hr = pRange->Invoke(dispid, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET, &dispparamsNoArgs, &varResult, NULL, NULL);
if (FAILED(hr)) {
printf("Failed to get number of rows.\n");
return 1;
}
numRows = varResult.lVal;
hr = pRange->GetIDsOfNames(IID_NULL, &dispidNumCols, 1, LOCALE_USER_DEFAULT, &dispid);
if (FAILED(hr)) {
printf("Failed to get IDs of names.\n");
return 1;
}
hr = pRange->Invoke(dispid, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET, &dispparamsNoArgs, &varResult, NULL, NULL);
if (FAILED(hr)) {
printf("Failed to get number of columns.\n");
return 1;
}
numCols = varResult.lVal;
// 确定数组大小
int numRowsInt = (int)numRows;
int numColsInt = (int)numCols;
double** pData = (double**)malloc(numRowsInt * sizeof(double*));
for (int i = 0; i < numRowsInt; i++) {
pData[i] = (double*)malloc(numColsInt * sizeof(double));
}
```
4. 读取数据并存储在数组中:
```c
// 读取数据
for (int i = 1; i <= numRowsInt; i++) {
for (int j = 1; j <= numColsInt; j++) {
VARIANT varValue;
VariantInit(&varValue);
IDispatch* pCell = NULL;
hr = pRange->GetIDsOfNames(IID_NULL, &dispidItem, 1, LOCALE_USER_DEFAULT, &dispid);
if (FAILED(hr)) {
printf("Failed to get IDs of names.\n");
return 1;
}
VARIANTARG vargIndex;
VariantInit(&vargIndex);
vargIndex.vt = VT_I4;
vargIndex.lVal = i * pow(2, 16) + j;
dispparams.rgvarg = &vargIndex;
dispparams.cArgs = 1;
hr = pRange->Invoke(dispid, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET, &dispparams, &varResult, NULL, NULL);
if (FAILED(hr)) {
printf("Failed to get cell.\n");
return 1;
}
pCell = varResult.pdispVal;
hr = pCell->GetIDsOfNames(IID_NULL, &dispidValue, 1, LOCALE_USER_DEFAULT, &dispid);
if (FAILED(hr)) {
printf("Failed to get IDs of names.\n");
return 1;
}
hr = pCell->Invoke(dispid, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET, &dispparamsNoArgs, &varValue, NULL, NULL);
if (FAILED(hr)) {
printf("Failed to get cell value.\n");
return 1;
}
pData[i - 1][j - 1] = varValue.dblVal;
}
}
```
5. 关闭Excel文件和COM接口:
```c
// 关闭对象
pRange->Release();
pWorksheet->Release();
pWorksheets->Release();
pWorkbook->Release();
pWorkbooks->Release();
pXLApp->Release();
// 释放内存
for (int i = 0; i < numRowsInt; i++) {
free(pData[i]);
}
free(pData);
// 关闭COM接口
CoUninitialize();
```
完整的代码如下所示:
```c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <ctype.h>
#include <math.h>
#include <errno.h>
#include <windows.h>
#include <ole2.h>
#include <olectl.h>
#include <ocidl.h>
int main()
{
// 打开Excel文件
CoInitialize(NULL);
IDispatch* pXLApp = NULL;
CLSID clsid;
CLSIDFromProgID(L"Excel.Application", &clsid);
HRESULT hr = CoCreateInstance(clsid, NULL, CLSCTX_LOCAL_SERVER, IID_IDispatch, (void**)&pXLApp);
if (FAILED(hr)) {
printf("Failed to create Excel instance.\n");
return 1;
}
// 打开工作簿
VARIANT varFileName;
VariantInit(&varFileName);
varFileName.vt = VT_BSTR;
varFileName.bstrVal = SysAllocString(L"example.xlsx"); // Excel文件名
DISPPARAMS dispparamsNoArgs = { NULL, NULL, 0, 0 };
VARIANT varResult;
IDispatch* pWorkbooks = NULL;
hr = pXLApp->GetIDispatch(L"Workbooks", (void**)&pWorkbooks);
if (FAILED(hr)) {
printf("Failed to get Workbooks object.\n");
return 1;
}
DISPID dispid = 0;
hr = pWorkbooks->GetIDsOfNames(IID_NULL, &L"Open", 1, LOCALE_USER_DEFAULT, &dispid);
if (FAILED(hr)) {
printf("Failed to get IDs of names.\n");
return 1;
}
VARIANTARG dispparamsOpen[4];
dispparamsOpen[3].vt = VT_BOOL;
dispparamsOpen[3].boolVal = FALSE;
dispparamsOpen[2].vt = VT_BOOL;
dispparamsOpen[2].boolVal = FALSE;
dispparamsOpen[1].vt = VT_BOOL;
dispparamsOpen[1].boolVal = FALSE;
dispparamsOpen[0].vt = VT_BSTR;
dispparamsOpen[0].bstrVal = varFileName.bstrVal;
dispparams.cArgs = 4;
dispparams.rgvarg = dispparamsOpen;
hr = pWorkbooks->Invoke(dispid, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &dispparams, &varResult, NULL, NULL);
if (FAILED(hr)) {
printf("Failed to open workbook.\n");
return 1;
}
IDispatch* pWorkbook = NULL;
hr = pWorkbooks->Invoke(0x3ec, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET, &dispparamsNoArgs, &varResult, NULL, NULL);
if (FAILED(hr)) {
printf("Failed to get item(1) of Workbooks object.\n");
return 1;
}
pWorkbook = varResult.pdispVal;
// 获取工作表对象
VARIANT varWorksheetName;
VariantInit(&varWorksheetName);
varWorksheetName.vt = VT_BSTR;
varWorksheetName.bstrVal = SysAllocString(L"Sheet1"); // 工作表名
IDispatch* pWorksheets = NULL;
hr = pWorkbook->GetIDispatch(L"Worksheets", (void**)&pWorksheets);
if (FAILED(hr)) {
printf("Failed to get Worksheets object.\n");
return 1;
}
IDispatch* pWorksheet = NULL;
hr = pWorksheets->Invoke(0x74, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET, &dispparamsNoArgs, &varResult, NULL, NULL);
if (FAILED(hr)) {
printf("Failed to get Item() of Worksheets object.\n");
return 1;
}
// 获取数据范围
VARIANT varRangeName;
VariantInit(&varRangeName);
varRangeName.vt = VT_BSTR;
varRangeName.bstrVal = SysAllocString(L"A1:C10"); // 数据范围
DISPID dispidNumRows = 0;
DISPID dispidNumCols = 0;
DISPID dispidItem = 0;
DISPID dispidValue = 0;
IDispatch* pRange = NULL;
hr = pWorksheet->GetIDsOfNames(IID_NULL, &varRangeName.bstrVal, 1, LOCALE_USER_DEFAULT, &dispid);
if (FAILED(hr)) {
printf("Failed to get IDs of names.\n");
return 1;
}
hr = pWorksheet->Invoke(dispid, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET, &dispparamsNoArgs, &varResult, NULL, NULL);
if (FAILED(hr)) {
printf("Failed to get Range object.\n");
return 1;
}
pRange = varResult.pdispVal;
// 获取数据大小
long numRows = 0;
long numCols = 0;
hr = pRange->GetIDsOfNames(IID_NULL, &L"Rows", 1, LOCALE_USER_DEFAULT, &dispidNumRows);
if (FAILED(hr)) {
printf("Failed to get IDs of names.\n");
return 1;
}
hr = pRange->Invoke(dispidNumRows, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET, &dispparamsNoArgs, &varResult, NULL, NULL);
if (FAILED(hr)) {
printf("Failed to get number of rows.\n");
return 1;
}
numRows = varResult.lVal;
hr = pRange->GetIDsOfNames(IID_NULL, &L"Columns", 1, LOCALE_USER_DEFAULT, &dispidNumCols);
if (FAILED(hr)) {
printf("Failed to get IDs of names.\n");
return 1;
}
hr = pRange->Invoke(dispidNumCols, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET, &dispparamsNoArgs, &varResult, NULL, NULL);
if (FAILED(hr)) {
printf("Failed to get number of columns.\n");
return 1;
}
numCols = varResult.lVal;
// 确定数组大小
int numRowsInt = (int)numRows;
int numColsInt = (int)numCols;
double** pData = (double**)malloc(numRowsInt * sizeof(double*));
for (int i = 0; i < numRowsInt; i++) {
pData[i] = (double*)malloc(numColsInt * sizeof(double));
}
// 读取数据
for (int i = 1; i <= numRowsInt; i++) {
for (int j = 1; j <= numColsInt; j++) {
VARIANT varValue;
VariantInit(&varValue);
IDispatch* pCell = NULL;
hr = pRange->GetIDsOfNames(IID_NULL, &L"Item", 1, LOCALE_USER_DEFAULT, &dispid);
if (FAILED(hr)) {
printf("Failed to get IDs of names.\n");
return 1;
}
VARIANTARG dispparamsItem[1];
dispparamsItem[0].vt = VT_I4;
dispparamsItem[0].lVal = i * pow(2, 16) + j;
DISPPARAMS dispparams = { dispparamsItem, NULL, 1, 0 };
hr = pRange->Invoke(dispid, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET, &dispparams, &varResult, NULL, NULL);
if (FAILED(hr)) {
printf("Failed to get cell.\n");
return 1;
}
pCell = varResult.pdispVal;
hr = pCell->GetIDsOfNames(IID_NULL, &L"Value", 1, LOCALE_USER_DEFAULT, &dispidValue);
if (FAILED(hr)) {
printf("Failed to get IDs of names.\n");
return 1;
}
hr = pCell->Invoke(dispidValue, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_PROPERTYGET, &dispparamsNoArgs, &varValue, NULL, NULL);
if (FAILED(hr)) {
printf("Failed to get cell value.\n");
return 1;
}
pData[i - 1][j - 1] = varValue.dblVal;
}
}
// 关闭对象
pRange->Release();
pWorksheet->Release();
pWorksheets->Release();
pWorkbook->Release();
pWorkbooks->Release();
pXLApp->Release();
// 释放内存
for (int i = 0; i < numRowsInt; i++) {
free(pData[i]);
}
free(pData);
// 关闭COM接口
CoUninitialize();
return 0;
}
```
c++调用stk生成轨道数据的代码
STK(Systems Tool Kit)提供了COM接口,可以通过C++调用STK生成轨道数据。具体步骤如下:
1. 安装STK软件并打开STK。
2. 在STK中创建一个场景,添加卫星、星座等对象,并设置其属性。
3. 在STK中生成轨道数据文件(.e文件),并保存到本地磁盘。
4. 在C++中通过COM接口调用STK,读取轨道数据文件并进行处理。
下面是一个简单的示例代码,演示了如何通过COM接口调用STK并生成轨道数据:
```cpp
// C++代码
#include <iostream>
#include <windows.h>
#include <oleauto.h>
int main()
{
// 初始化COM接口
CoInitialize(NULL);
// 创建STK对象
IDispatch* pStkApp;
CLSID clsid;
CoCreateInstance(CLSID_Application, NULL, CLSCTX_SERVER, IID_IDispatch, (void**)&pStkApp);
// 打开STK场景文件
VARIANT result;
BSTR filePath = SysAllocString(L"C:\\Temp\\MyScene.e");
VARIANT vtFilepath;
vtFilepath.vt = VT_BSTR;
vtFilepath.bstrVal = filePath;
DISPID dispID;
DISPPARAMS dispParams = { NULL, NULL, 0, 0 };
pStkApp->GetIDsOfNames(IID_NULL, &filePath, 1, LOCALE_USER_DEFAULT, &dispID);
pStkApp->Invoke(dispID, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &dispParams, &result, NULL, NULL);
// 生成轨道数据
VARIANT objPath;
objPath.vt = VT_BSTR;
objPath.bstrVal = SysAllocString(L"Satellite1");
VARIANT vtStartTime;
vtStartTime.vt = VT_BSTR;
vtStartTime.bstrVal = SysAllocString(L"01 Jan 2022 00:00:00.000");
VARIANT vtStopTime;
vtStopTime.vt = VT_BSTR;
vtStopTime.bstrVal = SysAllocString(L"01 Jan 2023 00:00:00.000");
VARIANT vtInterval;
vtInterval.vt = VT_BSTR;
vtInterval.bstrVal = SysAllocString(L"60");
VARIANT vtFilePath;
vtFilePath.vt = VT_BSTR;
vtFilePath.bstrVal = SysAllocString(L"C:\\Temp\\MyOutputFile.txt");
VARIANT vtFormat;
vtFormat.vt = VT_BSTR;
vtFormat.bstrVal = SysAllocString(L"e");
VARIANT vtCmd;
vtCmd.vt = VT_BSTR;
vtCmd.bstrVal = SysAllocString(L"ExportData");
DISPPARAMS exportParams = { &objPath, &vtStartTime, &vtStopTime, &vtInterval, &vtFilePath, &vtFormat, 7, 0 };
pStkApp->GetIDsOfNames(IID_NULL, &vtCmd.bstrVal, 1, LOCALE_USER_DEFAULT, &dispID);
pStkApp->Invoke(dispID, IID_NULL, LOCALE_USER_DEFAULT, DISPATCH_METHOD, &exportParams, &result, NULL, NULL);
// 释放资源
SysFreeString(filePath);
SysFreeString(objPath.bstrVal);
SysFreeString(vtStartTime.bstrVal);
SysFreeString(vtStopTime.bstrVal);
SysFreeString(vtInterval.bstrVal);
SysFreeString(vtFilePath.bstrVal);
SysFreeString(vtFormat.bstrVal);
SysFreeString(vtCmd.bstrVal);
pStkApp->Release();
CoUninitialize();
return 0;
}
```
需要注意的是,由于STK是Windows平台下的软件,因此该代码只能在Windows操作系统上运行。
相关推荐
![docx](https://img-home.csdnimg.cn/images/20210720083331.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![pdf](https://img-home.csdnimg.cn/images/20210720083512.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)
![](https://csdnimg.cn/download_wenku/file_type_ask_c1.png)