나는 기능 난에 C#으로 내 PInvoke를 래퍼 방법을 작성하는 방법이C#에서 (숯불 *의 PARAM [])로 함수를 마샬링하는 방법
int GetActiveNames(char* names[]);
과 같은 기본 DLL에서 함수를 가지고 날 문자열/문자의 배열을 반환 위의 함수?
는 는 I는 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입니다. 응용 프로그램은이 사실을 사용하여 첫 x 째 호출에서 길이를 0으로 지정하고 필요한 기 o 장치를 할당하고 정보를 얻기 위해 두 x 째 호출을 _ 행할 수 있습니다. 경로에 대한 호출은 컴퓨터 이름, IP는 및 인스턴스 식별자를 해결 저장 에 의해 할당 된 공용 프로젝트 번호 :
입력
allocatedProjects 파라미터. allocatedModels : 저장 장치가 이름, 경로 및 인스턴스 ID에 대한 호출자 에 의해 할당 된 모델 수입니다. allocatedProjectPathLen :의 할당 된 길이 : 컴퓨터 이름 allocatedIpLen를받을 스토리지 할당 된 길이 : 모델 경로 allocatedMachineNameLen를받을 스토리지 할당 된 길이 : 프로젝트 경로 allocatedModelPathLen을받을 스토리지 할당 된 길이 는 IP를받을 저장
출력 매개 변수
를 해결numProjects : API가 실제 활성 프로젝트 수를 저장할 위치의 포인터. numModels : API가 실제 총 프로젝트 수에 대한 개의 모델 수를 저장할 위치의 포인터. maxProjectPathLen : API가 가장 긴 프로젝트 경로의 길이를 저장할 위치의 포인터. maxModelPathLen : API가 가장 긴 모델 경로의 길이를 저장할 위치의 포인터. maxMachineNameLen : API가 가장 긴 시스템 이름의 길이를 저장할 위치의 포인터. maxIpLen : API가 가장 긴 IP 주소의 길이를 저장할 위치의 포인터. projectPaths : API가 활성 프로젝트의 구성 파일 경로를 저장하는 문자열 배열입니다. instanceIDs : API가 활성 프로젝트의 인스턴스 ID를 저장하는 배열. machineNames : API가 컴퓨터 이름을 저장하는 배열. 컨트롤러 IP : API가 IP 주소를 저장할 어레이. modelPaths : API가 모든 활성 프로젝트의 모델 경로를 저장할 배열. numModelsPerProject : API가 각 프로젝트의 모델 수를 저장하는 배열. 이 값을 사용하여 모델이 어떤 프로젝트에 속하는지 결정합니다. modelIDs : API가 모든 활성 프로젝트의 모델 ID를 저장하는 배열. modelStates : API가 모든 활성 프로젝트의 모델 상태를 저장하는 배열. projectPaths, machineNames 등을 얻을 OpalGetActiveProjects() 함수를 사용하는 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를 사용하는 것도 위법입니다. –