我有一個本地的dll,其功能看起來像這樣如何編組與C#(的char * PARAM [])的函數
int GetActiveNames(char* names[]);
如何在C#中創建我的PInvoke包裝方法的功能上面的函數返回給我一個字符串/字符數組?
更描述性..
我嘗試了P /調用方式和其示出試圖讀取或寫入受保護的存儲器中的下面的錯誤。這通常表明其他內存已損壞。。
我剛剛剝離了實際的C函數簽名,以使它更簡單。但這裏是完整的C函數簽名和函數參數的描述
int OpalGetActiveProjects(unsigned short allocatedProjects,
unsigned short *numProjects,
unsigned short allocatedModels,
unsigned short *numModels,
unsigned short allocatedProjectsPathLen,
unsigned short *maxProjectPathLen,
unsigned short allocatedModelPathLen,
unsigned short *maxModelPathLen,
unsigned short allocatedMachineNameLen,
unsigned short *maxMachineNameLen,
unsigned short allocatedIpLen,
unsigned short *maxIpLen,
char *projectPaths[],
unsigned short instanceIDs[],
char *machineNames[],
char *controllerIPs[],
char *modelPaths[],
unsigned short numModelsPerProject[]
unsigned short modelIDs[],
unsigned short modelStates[]);
函數返回活動項目的列表。對於每個項目,此函數返回配置文件的完整路徑,打開此項目的機器的名稱和IP地址,當前項目會話的實例ID以及屬於此項目的模型列表。 對於每個模型,都會返回路徑,ID和狀態。如果分配的存儲空間對於任何參數都太小,則不會返回任何列表,但會設置numProjects,numModels,maxProjectPathLen,maxModelPathLen,maxMachineNameLen和maxIpLen值,返回值是E2BIG。應用程序可以使用這個事實來指定第一次調用的長度爲0,分配所需的存儲併發出第二個調用來獲取信息。
輸入參數
allocatedProjects:用於存儲其中通過 分配的路徑中的呼叫者,機器名,IP地址和 實例ID的項目數。 allocatedModels:由 分配存儲的模型的數量調用者的名稱,路徑和實例ID。 allocatedProjectPathLen:存儲的分配長度接受項目路徑 allocatedModelPathLen:存儲的分配長度接收模式的路徑 allocatedMachineNameLen:存儲的分配長度接收機器名 allocatedIpLen:分配的長度存儲到接收的IP地址
輸出參數
numProjects:指向API將存儲活動項目的實際數量的指針。 numModels:指向API將存儲實際總數的指針數 所有活動項目的模型數。 maxProjectPathLen:指向API將存儲最長項目路徑長度的指針。 maxModelPathLen:指向API將存儲最長模型路徑長度的指針。 maxMachineNameLen:指向API將存儲最長機器名稱長度的指針。 maxIpLen:指向API將存儲 最長IP地址的長度的指針。 projectPaths:字符串數組,其中API將存儲活動項目的配置文件的路徑。 instanceID:其中API將存儲活動項目的實例ID的數組。 machineNames:其中API將存儲機器名稱的數組。 controllerIPs:其中API將存儲IP地址的數組。 modelPaths:其中API將存儲所有活動項目的模型路徑。 numModelsPerProject:其中API將存儲每個項目的模型數量。使用這些值來確定哪些模型屬於哪個項目。 modelIDs:其中API將存儲所有 活動項目的模型ID。 modelStates:其中API將存儲所有活動項目的模型狀態的數組。
還有它使用OpalGetActiveProjects()函數來獲取projectPaths,machineNames等C程序..
#include <stdio.h>
#include <stdlib.h>
#include <malloc.h>
#include <string.h>
// Header for getcwd() is platform-dependent
#if defined(WIN32)
#include <direct.h>
#include <windows.h>
#elif defined(__linux__)
#include <unistd.h>
#define _MAX_PATH 256
#endif
#include "OpalApi.h"
void PrintError(int rc, char *funcName);
#define FALSE 0
#define TRUE 1
int main (int argc, char* argv[])
{
char **projectPath, **modelPath;
char *projectPaths, *modelPaths;
char **loaderMachineName, **controllerIp;
char *loaderMachineNames, *controllerIps;
int i, rc, projectIdx;
unsigned short *instId;
int *instId2;
int * modelIds;
unsigned short *numModelsPerProject;
unsigned short *modelId;
unsigned short *modelState;
unsigned short allocProjects, numProjects;
unsigned short allocModels, numModels;
unsigned short allocProjectPathLen, maxProjectPathLen;
unsigned short allocModelPathLen, maxModelPathLen;
unsigned short allocMachineLen, maxMachineLen;
unsigned short allocIpLen, maxIpLen;
// Obtenir la taille des données.
allocProjects =allocModels = 0;
allocProjectPathLen = allocModelPathLen = 0;
allocMachineLen = allocIpLen = 0;
rc = OpalGetActiveProjects(0, &allocProjects,
0, &allocModels,
0, &allocProjectPathLen,
0, &allocModelPathLen,
0, &allocMachineLen,
0, &allocIpLen,
NULL, NULL, NULL, NULL,
NULL, NULL, NULL, NULL);
if ((rc != 0) && (rc != E2BIG))
{
PrintError(rc, "OpalGetActiveProject");
printf(" - alGetActiveProjects error output !!!\n");
printf("\t numProjects - %i \n", allocProjects);
printf("\t numModels - %i \n", allocModels);
printf("\t maxProjectPathLen - %i \n", allocProjectPathLen);
printf("\t maxModelPathLen - %i \n", allocModelPathLen);
//printf("\t maxMachineNameLen - %i \n", maxMachineNameLen);
printf("\t maxIpLen - %i \n", allocIpLen);
return (rc);
// Erreur
//return returnInstance;
}
projectPath = (char **)_alloca(allocProjects * sizeof(*projectPath));
projectPaths = (char *)_alloca(allocProjects * (allocProjectPathLen + 1) * sizeof(*projectPaths));
loaderMachineName = (char **)_alloca(allocProjects * sizeof(*loaderMachineName));
loaderMachineNames = (char *)_alloca(allocProjects * (allocMachineLen + 1) * sizeof(*loaderMachineNames));
controllerIp = (char **)_alloca(allocProjects * sizeof(*controllerIp));
controllerIps = (char *)_alloca(allocProjects * (allocIpLen + 1) * sizeof(*controllerIps));
numModelsPerProject = (unsigned short*)_alloca(allocProjects * sizeof(*numModelsPerProject));
modelPath = (char **)_alloca(allocModels * sizeof(*modelPath));
modelPaths = (char *)_alloca(allocModels * (allocModelPathLen + 1) * sizeof(*modelPaths));
for (i = 0; i < allocProjects; ++i)
{
projectPath[i] = &projectPaths[i * (allocProjectPathLen + 1)];
loaderMachineName[i] = &loaderMachineNames[i * (allocMachineLen + 1)];
controllerIp[i] = &controllerIps[i * (allocIpLen + 1)];
}
for (i = 0; i < allocModels; ++i)
{
modelPath[i] = &modelPaths[i * (allocModelPathLen + 1)];
}
instId = (unsigned short *)_alloca(allocProjects * sizeof(*instId));
instId2 = (int *)_alloca(allocProjects * sizeof(*instId2));
modelId = (unsigned short*)_alloca(allocModels * sizeof(*modelId));
modelState = (unsigned short *)_alloca(allocModels * sizeof(*modelState));
rc = OpalGetActiveProjects(allocProjects, &numProjects,
allocModels, &numModels,
allocProjectPathLen, &maxProjectPathLen,
allocModelPathLen, &maxModelPathLen,
allocMachineLen, &maxMachineLen,
allocIpLen, &maxIpLen,
projectPath, instId,
loaderMachineName, controllerIp, modelPath,
numModelsPerProject, modelId, modelState);
printf(" - OpalGetActiveProjects output !!!\n");
printf("\t numProjects - %i \n", allocProjects);
printf("\t numModels - %i \n", allocModels);
printf("\t maxProjectPathLen - %i \n", allocProjectPathLen);
printf("\t maxModelPathLen - %i \n", allocModelPathLen);
//printf("\t maxMachineNameLen - %i \n", maxMachineNameLen);
printf("\t maxIpLen - %i \n", allocIpLen);
for(i=0; i<numProjects; i++)
{
printf("\t \t projectPath[%d] = %s \n", i, *(projectPath +i));
printf("\t \t instId[%d] = %d \n", i, *(instId + i));
printf("\t \t loaderMachineName[%d] = %s \n", i, *(loaderMachineName + i));
printf("\t \t controllerIp[%d] = %s \n", i, *(controllerIp + i));
printf("\t \t numModelsPerProject[%d] = %d \n", i, * (numModelsPerProject +i));
}
for(i=0; i<numModels; i++)
{
printf("\t \t modelPath[%d] = %s \n", i, *(modelPath+i));
printf("\t \t modelId[%d] = %d \n", i, *(modelId +i));
printf("\t \t modelState[%d] = %d \n", i, *(modelState+i));
}
OpalDisconnect();
getchar();
}
void PrintError(int rc, char *funcName)
{
char buf[512];
unsigned short len;
OpalGetLastErrMsg(buf, sizeof(buf), &len);
printf("Error !!! \n %s (code %d) from %s\n", buf, rc, funcName);
}
你不能,沒辦法正確銷燬返回的字符串後使用它們。這個函數在本地代碼中使用並不安全,因此使用C++/CLI也是一個垃圾短片。 –