Q&A

  • 델파이 dll을 vc++에서 동적할당해서 사용하기 - 결과값이 이상해서 문의드립니다. 도움 좀~~~!!!
안녕하십니까? 델파이 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++만 않되니... ㅠㅠ;;
2  COMMENTS
  • Profile
    공춘호 2006.12.13 04:14
    안녕하세요...
    혹시 Delphi에서의 String과 C에서의 문자열 차이 아닌가요??

    보통 C언어 (char*)에서는 끝을 Null로 저장하여 문자의 길이를 아는데,
    Pascal에서는 젤 첫 1Byte가 뒤에 나오는 문자의 길이가 저장되고,
    Delphi에서는 첫 2Byte가 뒤에 나오는 문자의 길이,
    MFC 에서는 첫 4Byte가 문자의 길이가 저장되는것으로 알고있습니다. (아닌가???)

    그러니까...
    C에서는 "abc\0def"라고 하면 앞의 "abc"만 인식하고요.
    Delphi에서는 제일 첫 글자에서 뒤에 나오는 길이가 저장되고,
    Null과 관계없이 모든 글자가 입력 가능합니다.

    아래 설명한 내용만으로는 정확한 의미를 모르겠네요...
    이 답이 맞나???ㅋ



  • Profile
    김운필 2006.12.05 00:22
    CString 형의 문제일 수 있으니 그냥 output 직접 메모리 디버깅 해 보심이..

    => 유니코드나 멀티바이트 문자 같은 문제...?????

    그 다음  CString 을 CStringA형........ 이런걸로 선언해 보심이

    즐프...