2011-10-27 69 views
9

Tôi có bảng ICOP VDX-6354 chạy Win CE. Tôi đang cố gắng để kiểm soát buzzer của hội đồng quản trị từ chương trình C# của tôi. Tôi đã thử tất cả các playound vv "coredll.dll" nền tảng gọi. không ai trong số họ làm việc cho đến nay. Vì vậy, cơ hội cuối cùng của tôi là tạo DLL của riêng tôi.Cách tạo DLL sẽ được sử dụng trong C#

unsigned char inp(short addr) 
{ 
    unsigned char cValue; 
    _asm 
    { 
     mov dx, addr 
     in ax, dx 
     mov cValue, al 
    } 
    return cValue; 
} 
void outp(int addr, unsigned char val) 
{ 
    __asm 
    { 
     push edx 
     mov edx, DWORD PTR addr 
     mov al, BYTE PTR val 
     out dx, al 
     pop edx 
    } 
} 
bool MyBeep(DWORD dwFreq, DWORD dwDuration) 
{ 
    outp(0x43, 0xb6); // Set Buzzer 
    outp(0x42, (0x1234dc/dwFreq)); // Frequency LSB 
    outp(0x42, (0x1234dc/dwFreq) >> 8); // Frequency MSB 
    outp(0x61, inp(0x61) | 0x3); // Start beep 
    Sleep(dwDuration); 
    outp(0x61, inp(0x61) & 0xfc); // End beep 
    return TRUE; 
} 

Mã trên có sẵn trong bảng dữ liệu của bảng. Tôi muốn biên dịch nó như là một DLL sau đó gọi nó trong chương trình C# của tôi như

[DllImport("Buzzer.dll", EntryPoint = "MyBeep")] 
public static extern void MyBeep(uint dwFreq, uint dwDuration); 

tôi đã sử dụng một tiền tố như sau khi tôi biên soạn:

extern "C" __declspec(dllexport) bool MyBeep(DWORD dwFreq, DWORD dwDuration) 

Vì vậy mà tôi hy vọng sẽ có thể kiểm soát còi. Vấn đề của tôi là tôi không thể thành công trong việc biên dịch nó. Tôi đã làm theo các bước here nhưng nó không giúp tôi.

Tôi nên làm gì từng bước?

CHỈNH SỬA:

Tôi nghĩ rằng tôi đã tạo DLL. Tôi đã thử một cách khác để xây dựng DLL found here.

Bây giờ, tôi đã sao chép tệp DLL vào thư mục Debug của dự án khởi động C# của tôi (Các DLL khác của dự án cũng nằm trong thư mục này). Sau đó, tôi cố gắng để gọi chức năng MyBeep từ MyBeep.DLL trong dự án C# của tôi bằng cách:

[DllImport("MyBeep.dll", EntryPoint = "MyBeep")] 
public static extern bool MyBeep(UInt32 dwFreq, UInt32 dwDuration); 

Nhưng nó mang lại cho các ngoại lệ sau đây.

Không thể tìm thấy PInvoke DLL 'MyBeep.dll'.

Tôi có thiếu gì đó không? Xin vui lòng kiểm tra các liên kết được đưa ra ở trên mà tôi lừa để xây dựng các DLL để hiểu những gì tôi đã làm cho đến nay. Trân trọng.

+1

Điều gì không thành công? Thông báo lỗi? Bạn đã xây dựng như thế nào? Trong ngắn hạn, chi tiết xin vui lòng. –

+0

+1 có vẻ như là một câu hỏi rất thực tế, không chắc chắn lý do tại sao một người nào đó đã bỏ phiếu để đóng. –

+0

nó không biên dịch thành công. Như tôi đã nói trong câu hỏi của mình, tôi đã làm theo hướng dẫn "cách thực hiện" từng bước. Khi tôi cố gắng biên dịch nó được yêu cầu cho "Phiên thực thi cho phiên gỡ lỗi". Và thực thi duy nhất có sẵn trên dropbox là RegSvr32. Khi tôi chọn RegSvr32 và tiếp tục, nó nói sử dụng: regsrv32 [/ u] [/ s] [/ n] [/ i] vv trên một màn hình cảnh báo riêng biệt và nó không đưa ra bất kỳ lỗi nào trong trình biên dịch. –

Trả lời

0

Mặc dù thông báo lỗi đề xuất cách khác, bạn nên kiểm tra tên của hàm đã xuất. Đối với Win32 tôi luôn sử dụng this tool. Đối với một dll CE, có thể DUMPBIN /EXPORTS hoạt động.

Tên functon có thể được gọi là __MyBeep: Tôi tin rằng tiền tố này là một quy ước C.

1

Có hai vấn đề mà bạn đã có:

  1. Bạn cần phải xây dựng các dll, không cố gắng và debug nó. Nếu nó nằm trong cùng dự án với dự án C# của bạn thì hãy thiết lập dự án C# làm dự án khởi động (nhấn chuột phải vào tệp dự án), nếu không bạn sẽ chỉ phải chọn Build chứ không phải Start Debugging (nếu bạn đang sử dụng shortcut các phím này có thể là Ctrl + Shift + B [nếu sử dụng thiết lập môi trường C#] hoặc F7 [nếu bạn đang sử dụng thiết lập môi trường C++]).

  2. Bạn cần có DLL ở đúng vị trí. Nếu bạn muốn tự động hoá này sau đó chỉ cần thêm một bước sau xây dựng cho dự án C++ (các thuộc tính dự án, xây dựng hành động nếu tôi nhớ chính xác, và sau xây dựng) mà làm điều gì đó như copy "$(TargetPath)" "$(SolutionDir)\CsProj\bin\$(ConfigurationName)\*.*"

Một số những macro có thể là một chút, nhưng bạn sẽ có được ý tưởng chung.

EDIT: Bạn cũng cần đảm bảo rằng dự án C++ của bạn đang xây dựng trước dự án C#. Nhấn chuột phải vào tập tin dự án C# của bạn, và đi đến Project Dependencies, sau đó đánh dấu vào thư viện C++ trong hộp Depends on. Để đảm bảo rằng bước xây dựng sau của bạn đang hoạt động, hãy thử xây dựng dự án C++ và kiểm tra nó sao chép tệp DLL vào thư mục chính xác trong dự án C# của bạn.Nó sẽ gắn cờ các lỗi trong cửa sổ đầu ra nếu nó không. Nếu bạn làm theo hướng dẫn đó để tạo một DLL, bạn nên ổn.

+0

không, vẫn không hoạt động ... –

Các vấn đề liên quan