2011-10-27 11 views
9

Tengo la placa ICOP VDX-6354 ejecutando Win CE. Estoy tratando de controlar el zumbador del tablero desde mi programa C#. Probé todo el playsound, etc. invoca la plataforma "coredll.dll". ninguno de ellos funcionó tan lejos. Así que mi última oportunidad es crear mi propia DLL.Cómo crear una DLL que se usará en 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; 
} 

El código anterior está disponible en la ficha técnica de la placa. Quiero compilarlo como un archivo DLL invocarla en mi programa en C# como

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

he usado un prefijo de la siguiente manera cuando compilé:

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

Así que es de esperar que sería capaz de controlar la zumbador. Mi problema es que no podría ser exitoso compilarlo. Seguí los pasos here pero no me ayudó.

¿Qué debo hacer paso a paso?

EDIT:

creo que he construido la DLL. Intenté otra manera de construir el DLL found here.

Ahora, copié el archivo DLL a la carpeta de depuración de mi proyecto de inicio C# (otras DLL del proyecto también están en esta carpeta). Entonces trato de invocar la función de MyBeep MyBeep.DLL en mi proyecto de C# por:

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

pero da la siguiente excepción.

No se encuentra PInvoke DLL 'MyBeep.dll'.

¿E-cando algo? Por favor, compruebe los enlaces anteriores que hice trampa para construir el archivo DLL para comprender lo que hice hasta ahora. Saludos.

+1

¿Qué falló? ¿Error de mensajes? ¿Cómo construiste? En resumen, más detalles por favor. –

+0

+1 parece una pregunta muy real, no estoy seguro de por qué alguien votó para cerrar. –

+0

simplemente no se compiló correctamente. Como dije en mi pregunta, seguí paso a paso el tutorial de "cómo hacerlo". Cuando traté de compilar, solicité "Ejecutable para la sesión de depuración". Y el único ejecutable disponible en Dropbox es RegSvr32. Cuando elijo RegSvr32 y continúo, dice uso: regsrv32 [/ u] [/ s] [/ n] [/ i] etc. en una pantalla de advertencia separada y no da ningún error en el compilador. –

Respuesta

0

Aunque el mensaje de error sugiere lo contrario, debe verificar el nombre de la función exportada. Para Win32 siempre uso this tool. Para un dll CE, tal vez DUMPBIN /EXPORTS funciona.

El nombre de la función es probable que se llame __MyBeep: creo que este prefijo es una convención de C.

1

Hay dos cuestiones que tienes:

  1. que necesita para construir el archivo DLL, no tratar de depurarlo. Si está en el mismo proyecto que su proyecto C#, configure el proyecto C# como proyecto de inicio (haga clic derecho en el archivo del proyecto), de lo contrario solo tendrá que seleccionar Crear en lugar de Iniciar la depuración (si usa el acceso directo) estas teclas probablemente serán Ctrl + Shift + B [si usa la configuración del entorno C#] o F7 [si está usando la configuración del entorno C++]).

  2. Necesita tener la DLL en la ubicación correcta. Si desea automatizar esto, entonces sólo tiene que añadir un paso posterior a la generación del proyecto de C++ (propiedades del proyecto, construcción de acciones si no recuerdo mal, y posterior a la generación), que hace algo como copy "$(TargetPath)" "$(SolutionDir)\CsProj\bin\$(ConfigurationName)\*.*"

Algunas de esas macros podría estar un poco apagado, pero debería tener la idea general.

EDITAR: También debe asegurarse de que su proyecto C++ se está desarrollando antes de su proyecto C#. Haga clic derecho en su archivo de proyecto C#, y vaya a Dependencias del proyecto, luego marque la biblioteca C++ en el cuadro Depende de. Para asegurarse de que su paso posterior a la compilación funciona, intente construir solo el proyecto C++ y, al verificarlo, copie la DLL en el directorio correcto en su proyecto C#.Marcará los errores en la ventana de salida si no lo hace. Si siguió ese tutorial para crear una DLL, debería estar bien.

+0

no, todavía no funciona ... –

Cuestiones relacionadas