안녕하십니까? 델파이 dll을 vc++샘플 프로그램에서 input값을 입력하여 결과 rc(return 코드), output 문자열값을 받아오려고 합니다.
음 VB및 델파이에선 input값을 입력받아 rc, output값을 정확히 가져오구요.
다만 vc++로 만든것에서만 output값이 이상하게 깨져나와서.. 한자정도? (?? 이런식으로..), rc값은 정확히 받아옵니다.
output값으론 456byte정도의 문자열이 옵니다. 좀 긴데.. ?? 이렇게만 오니..
7을 리턴하면 7, 1을 리턴하면 1을..
델파이 dll에서 선언된것은 이런식으로 선언되어있고.. function XxxxTran(InStr:PChar; out OutStr:PChar):integer; stdcall;
VB 클라이언트 소스부분에서 선언되기로는
Public Declare Function XxxxTran Lib ".\XxxxPC.dll" (ByVal message As String, ByRef getmessage As String) As Integer
이런식으로 선언되어서 잘사용하고 있습니다.
델파이 dll에서 input값, output값을 Application.MessageBox(InStr,'요청 메세지');로 찍어봤습니다.
정확히 input값 찍히고 output값도 정확히 찍힙니다. 전달시 문제가 있는건지..
VC++용으로 개발하려니 OutStr값이 이상하게 깨져나와서 고수님들께 문의드려봅니다.
아래 하단 소스는 VC++ 클라이언트 소스부분이며 output으로 OutStr을 받습니다.
===========================================================================================================
void CXxxxPC_clientDlg::OnButton1()
{
int rc;
char input[2048], output[2048];
CString str, outstr, outstr_msg;
int nIndex = 0;
nIndex = m_combo1.GetCurSel();
m_combo1.GetLBText(nIndex, str);
sprintf(input, "%s", str);
Maker_Log(input);
memset(output, 0x00, sizeof(output));
// dll 동적 시작
int (__stdcall *XxxxTran)(char *, char *);
HINSTANCE hLib = LoadLibrary("XxxxPC.dll");
// typedef BOOL (__cdecl FUNC)(HWND hWnd, LPCSTR lpszIP, UINT iPort);
// typedef BOOL (__stdcall FUNC)(HWND hWnd, LPCSTR lpszIP, UINT iPort);
if(hLib == NULL)
return;
XxxxTran = (int(*)(char *, char *))GetProcAddress(hLib, "XxxxTran");
if(XxxxTran == NULL)
{
AfxMessageBox("XxxxPC.DLL Not Found");
FreeLibrary(hLib);
return;
}
// dll 동적 끝
UpdateData(TRUE);
rc = XxxxTran(input, output); => input값 입력, output값 받음. rc결과값 받음. (rc정상), output값이 => ??, 등등 이상하게 깨집니다.
UpdateData(FALSE);
FreeLibrary(hLib);
outstr.Format("%d, %s", sizeof(output), output);
outstr_msg.Format("%d,%d/%s", sizeof(output), rc, output);
AfxMessageBox(outstr_msg);
// m_edit2.SetSel(-1,0);
// m_edit2.SetWindowText(outstr);
}
===========================================================================================================
제발 도움 좀 부탁드리겠습니다. VB, Delphi로는 결과값을 잘받아오는데.. VC++만 않되니... ㅠㅠ;;
혹시 Delphi에서의 String과 C에서의 문자열 차이 아닌가요??
보통 C언어 (char*)에서는 끝을 Null로 저장하여 문자의 길이를 아는데,
Pascal에서는 젤 첫 1Byte가 뒤에 나오는 문자의 길이가 저장되고,
Delphi에서는 첫 2Byte가 뒤에 나오는 문자의 길이,
MFC 에서는 첫 4Byte가 문자의 길이가 저장되는것으로 알고있습니다. (아닌가???)
그러니까...
C에서는 "abc\0def"라고 하면 앞의 "abc"만 인식하고요.
Delphi에서는 제일 첫 글자에서 뒤에 나오는 길이가 저장되고,
Null과 관계없이 모든 글자가 입력 가능합니다.
아래 설명한 내용만으로는 정확한 의미를 모르겠네요...
이 답이 맞나???ㅋ