공장 이야기

PInvokeStackImbalance 오류

바다가소주라면- 2020. 11. 19. 10:50

회사의 강요???로 C#을 하게된 요즘... dll에서 "char *" 받아올 일이 생겨 검색 하든 중 발견한...

 

blog.naver.com/thesuffering/221715580971

 

아 블로그 이웃여러분들 도와주세요 ㅠ C++ DLL C#

아 왠만해서는 질문 안하는데 이건 도저히 모르겠습니다. ​ 업무중에 C++ DLL을 C#에서 불러와 사용...

blog.naver.com

요약 하자면 C로 만들어진 dll 의 함수를 호출 하면 PInvokeStackImbalance 라는 오류가 난다는...

 

 

CAN_Access.dll 라는 dll 이고... 호출 함수는

 

#define CAN_HANDLE long

CAN_HANDLE __stdcall CAN_OpenVcp(const char *comPortName, long comBaudrate);

 

회사에서 장비관련 dll을 하고 있고... dll 중 오래된는도 있어... 테스트 해본 결과... 동일 한 오류를 만나게된.

PInvokeStackImbalance 로 구글 님하에게 물어 보면... 대부분 

CallingConvention = CallingConvention.StdCall, Cdecl 에 대한 이야기뿐... 하지만 뭘 해줘도 결과는 동일.

 

혹시나 해서 C++ 로 호출 해봄...

 

typedef long (__stdcall *pCAN_OpenVcp)(const char* , long );
pCAN_OpenVcp  CAN_OpenVcpEx;

 

  HMODULE hDll = ::LoadLibraryA("CAN_Access.dll");

  if (nullptr == hDll)

    return;

  CAN_OpenVcpEx = (pCAN_OpenVcp)GetProcAddress(hDll, "CAN_OpenVcp");

  CAN_OpenVcpEx("dsfsdf", 0);

 

정상 동작함... 뭐 가 문제 일까??? 검색+테스트 중... 질문 올린 글에 댓글에서...

neurowhai 님의 댓글...

 

뉴로와이의 잡블로그 : 네이버 블로그

프로그래밍을 취미로 하며 인공지능 만드는 것이 꿈인 인간의 잡블로그 입니다.

blog.naver.com

C++ 의 long 랑 c# 의 long 가 다르다는...

 

 [DllImport("lib/CAN_Access.dll", EntryPoint = "CAN_OpenVcp", CallingConvention = CallingConvention.StdCall)]

 public static extern long CAN_OpenVcp([MarshalAs(UnmanagedType.LPStr)] string strComPortName, int comBaudrate);

 

CallingConvention.StdCall 이렇게 호출 해야 하지만 long 도 int 로 바꾸어 주어야 됨...

ㅡ,ㅡ;;;

 

역쉬 C# 이랑 여의도는 나랑 안맞는듯...

 

혹시나 해서 CAN_Access.dll 을 IDA Pro 로 까보니...ㅡ,ㅡ;;;

int __stdcall CAN_OpenVcp(char *Source, int) <<< long 가 아니고 int... ㅡ,ㅡ;;;

 

아 구디랑 Chromium 이랑 놀때가 그리운!!!