-
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 이랑 놀때가 그리운!!!
'공장 이야기' 카테고리의 다른 글
Chromium 76.0.3809.87 버전 빌드 시 오류... (0) 2022.04.26 CEF 빌드 (4) 2021.06.09 C++ dll로 WCHAR* 형태의 값 C#으로 넘길 때... (0) 2020.11.17 C# 다른 응용 프로그램에 Parameter로 한글 값 넘길때... (0) 2020.10.16 JCEF Window 빌드 (0) 2020.04.07